Introduction

This document lays out some key findings from a survey that was distributed to Texas school districts School Board Members and Superintendents that particpated in the Lone Star Governance (LSG) 2-day workshop training. The first response was record on 06/03/2019, and the most recent response was recorded on 06/24/2019.

Key findings

* = To be discussed in meeting.

Survey Response descriptives

Applicable responses


129 applicable responses to the LSG survey

There are 135 survey respondent(s) in the dataset. 6 respondent(s) consented, but did not fill out the survey. 7 respondent(s) did not consent to the survey. 1 respondent(s) opened the survey, but did not fill out any portion. Therefore, there were a total of 129 applicable responses to the LSG survey.

Please note that, of these 129 respondents, 24% of respondents completed less than half of the survey

Districts without survey responses


The following districts did not provide any responses to the survey:

Respondents by Role Type

School Board member results

Descriptives

Experience in role

In total, how many years have you served in this role for this LEA?

School board meetings attended

How many school board meetings have you attended during the 2018-19 school year (including only full school board meetings that are open to the public)?

Extent to which stakeholders provide input


In 2018-19, to what extent have the following groups of stakeholders provided input to the school board regarding development of goals or vision?





Other response answers

Opinions of school board meetings


To what extent do you agree with or disagree with the following statements regarding school board discussions?



Note: Gray cells represent lower agreeance with the items (columns). The responses are separated by district (rows)

Engagement in activities


How often does your school board engage in the following monitoring activities?



Opinions of LSG workshop effectiveness


To what extent do you agree or disagree with the following statements about operating procedures of the school board and superintendent



Opinion of LSG workshop


To what extent do you agree or disagree with the following statements regarding LSG



Superintendent results

Descriptives

Experience in role

In total, how many years have you served in this role for this LEA?

School board meetings attended

How many school board meetings have you attended during the 2018-19 school year (including only full school board meetings that are open to the public)?

Extent to which stakeholders provide input


In 2018-19, to what extent have the following groups of stakeholders provided input to the school board regarding development of goals or vision?





Other response answers

Opinions of school board meetings


To what extent do you agree with or disagree with the following statements regarding school board discussions?



Engagement in activities


How often does your school board engage in the following monitoring activities?



Note: Gray cells represent lower agreeance with the items (columns). The responses are separated by district (rows)

Opinions of LSG workshop effectiveness


To what extent do you agree or disagree with the following statements about operating procedures of the school board and superintendent



Opinion of LSG workshop


To what extent do you agree or disagree with the following statements regarding LSG



Comparisons by Roles

Extent to which stakeholders provide input


In 2018-19, to what extent have the following groups of stakeholders provided input to the school board regarding development of goals or vision?



Opinions of school board meetings


To what extent do you agree with or disagree with the following statements regarding school board discussions?



Engagement in activities


How often does your school board engage in the following monitoring activities?



Opinions of LSG workshop effectiveness


To what extent do you agree or disagree with the following statements about operating procedures of the school board and superintendent



Opinion of LSG workshop


To what extent do you agree or disagree with the following statements regarding LSG



Goal Development

School board has a Vision developed

Has your school board developed and adopted a vision for the LEA?

School board has goals

Has your school board adopted goals related to student outcomes that are currently being used?

Examples of goals

Are these Goals S.M.A.R.T.?

Specific
Measurable
Achievable
Relevant
Time-based

In the text boxes below, please provide examples of two of the goals related to student outcomes that the school board has in place for the 2018-19 school year.

Strong S.M.A.R.T. Goals

  1. “The percentage of kindergarten-grade2 students reading on or above grade level will increase from 64% to 90% by year 2023”
  2. “Percentage of students reading on or above grade level will increase from 43% to 70% by August 31, 2021.”
  3. “By school year 2020-2021 85% of all 2nd grade students will be reading on grade level”

Weak S.M.A.R.T. Goals

  1. “increase reading mastery”
  2. “Higher graduation rate”
  3. “To see improvement In reading”

Questions?

Please send any questions to Neil Yetz, MPH at nyetz@air.org

LS0tDQp0aXRsZTogIkxvbmUgU3RhciBHb3Zlcm5hbmNlIFN1cnZleSBLZXkgRmluZGluZ3MiDQphdXRob3I6ICIwNy8xNi8yMDE5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBodG1sX25vdGVib29rOg0KICAgIHRoZW1lOiB5ZXRpDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICczJw0KLS0tDQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoubWFpbi1jb250YWluZXIgew0KICBtYXgtd2lkdGg6IDgwMHB4Ow0KICBtYXJnaW4tbGVmdDogYXV0bzsNCiAgbWFyZ2luLXJpZ2h0OiBhdXRvOw0KfQ0KPC9zdHlsZT4NCiAgICANCmBgYHtyIHNldC1vcHRpb25zLCBlY2hvPUZBTFNFLCBjYWNoZT1GQUxTRX0NCg0KDQojDQojb3B0aW9ucyh3aWR0aCA9IDQwMCkNCmBgYA0KDQoNCiNJbnRyb2R1Y3Rpb24NClRoaXMgZG9jdW1lbnQgbGF5cyBvdXQgc29tZSBrZXkgZmluZGluZ3MgZnJvbSBhIHN1cnZleSB0aGF0IHdhcyBkaXN0cmlidXRlZCB0byBUZXhhcyBzY2hvb2wgZGlzdHJpY3RzIFNjaG9vbCBCb2FyZCBNZW1iZXJzIGFuZCBTdXBlcmludGVuZGVudHMgdGhhdCBwYXJ0aWNwYXRlZCBpbiB0aGUgW0xvbmUgU3RhciBHb3Zlcm5hbmNlIChMU0cpXShodHRwczovL3RlYS50ZXhhcy5nb3YvbHNnLykgMi1kYXkgd29ya3Nob3AgdHJhaW5pbmcuIFRoZSBmaXJzdCByZXNwb25zZSB3YXMgcmVjb3JkIG9uIDA2LzAzLzIwMTksIGFuZCB0aGUgbW9zdCByZWNlbnQgcmVzcG9uc2Ugd2FzIHJlY29yZGVkIG9uIDA2LzI0LzIwMTkuDQoNCg0KI0tleSBmaW5kaW5ncw0KKiBbPGI+PHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5TdXJ2ZXkgUmVzcG9uc2VzPC9iPl0oI3NlYzMpPGZvbnQgc2l6ZT0iMyI+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+Kjwvc3Bhbj48L2ZvbnQ+DQogICAgKyBbPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5GaW5hbCBOID0gMTI5IHJlc3BvbnNlc10oI3NlYzMpDQogICAgKyBbPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj4xMDUgU2Nob29sIEJvYXJkIE1lbWJlciByZXNwb25zZXNdKCNzZWMzKQ0KICAgICsgWzxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+MjQgU3VwZXJpbnRlbmRlbnQgcmVzcG9uc2VzXSgjc2VjMykNCjxicj48YnI+DQoqIFs8Yj48c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPlNjaG9vbCBCb2FyZCBNZW1iZXIgKFNCTSkgcmVzdWx0cyAoTiA9IDEwNSk8L2I+XSgjc2VjNCkNCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPk1vc3QgU0JNcyBoYXZlIDMtOSB5ZWFycyBvZiBleHBlcmllbmNlIGluIHRoYXQgcm9sZV0oI3NlYzQuMSk8Zm9udCBzaXplPSIzIj48c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4qPC9zcGFuPjwvZm9udD4NCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPlNCTXMgYWdyZWUgdGhhdCBTY2hvb2wgYWRtaW5zICYgTEVBIGFkbWlucyBwcm92aWRlIHRoZSBtb3N0IGlucHV0IHRvIHRoZSBzY2hvb2wgcmVnYXJkaW5nIHRoZSBkZXZlbG9wbWVudCBvZiBnb2FscyBvciB2aXNpb24sIENvbW11bml0eSBtZW1iZXJzIGFuZCBzdHVkZW50cyBwcm92aWRlIHRoZSBsZWFzdF0oI3NlYzQuMik8Zm9udCBzaXplPSIzIj48c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4qPC9zcGFuPjwvZm9udD4NCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPkRpc3RyaWN0cyBzZWVtIHRvIGFncmVlIHRoYXQgdGhlIGJvYXJkIHByb3ZpZGVzIGhvbmVzdCBhbmQgcmVzcGVjdGZ1bCBkaXNjdXNzaW9uXSgjc2VjNC4zKQ0KICAgICsgWzxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+TW9zdCBkaXN0cmljdHMgYXJlIG1vbml0b3Jpbmcgc3R1ZGVudCBvdXRjb21lcyBvbiBhIHF1YXJ0ZXJseSAtIG1vbnRobHkgYmFzaXNdKCNzZWM0LjQpDQogICAgKyBbPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5Nb3N0IHJlc3BvbmRlbnRzIGFncmVlIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBCb2FyZCBhbmQgc3VwZXJpbnRlbmRlbnQgaXMgY29sbGFib3JhdGl2ZSB0byBhY2NvbXBsaXNoIHN0dWRlbnQgb3V0Y29tZSBnb2FscywgYnV0IGRvIG5vdCBmZWVsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIEJvYXJkIG1lbWJlcnMgdG8gZ2l2ZSBpbnN0cnVjdGlvbiB0byBzdGFmZiBtZW1iZXJzXSgjc2VjNC41KQ0KICAgICsgWzxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+T3BpbmlvbnMgb2YgdGhlIExTRyB3b3Jrc2hvcCB3ZXJlIGdyZWF0ISBtb3N0IHJlc29uZGVudHMgc2VlbSB0byB0aGluayB0aGF0IHRoZSBMU0cgd29ya3Nob3AgcmVhbGx5IGhlbHBlZCBhbmQgd2FzIGVuZ2FnaW5nIV0oI3NlYzQuNikNCjxicj48YnI+DQoqICBbPGI+PHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5TdXBlcmludGVuZGVudCByZXN1bHRzIChOID0gMjQpPC9iPl0oI3NlYzUpDQogICAgKyBbPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5Nb3N0IFN1cGVyaW50ZW5kZW50cyBoYXZlIDMtOSB5ZWFycyBvZiBleHBlcmllbmNlIGluIHRoYXQgcm9sZV0oI3NlYzUuMSk8Zm9udCBzaXplPSIzIj48c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4qPC9zcGFuPjwvZm9udD4NCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPlN1cGVyaW50ZW5kZW50cyBhZ3JlZSB0aGF0IHNjaG9vbCBhZG1pbnMgJiBMRUEgYWRtaW5zIHByb3ZpZGUgdGhlIG1vc3QgaW5wdXQgdG8gdGhlIHNjaG9vbCByZWdhcmRpbmcgdGhlIGRldmVsb3BtZW50IG9mIGdvYWxzIG9yIHZpc2lvbiwgQ29tbXVuaXR5IG1lbWJlcnMgYW5kIHN0dWRlbnRzIHByb3ZpZGUgdGhlIGxlYXN0XSgjc2VjNS4yKTxmb250IHNpemU9IjMiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPio8L3NwYW4+PC9mb250Pg0KICAgICsgWzxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+U3VwZXJpbnRlbmRlbnRzIGhhdmUgbG93ZXIgYWdyZWVhbmNlIG9mIHRoZSByZXNwZWN0ZnVsbmVzcyBhbmQgaG9uZXN0eSBpbiBCb2FyZCBtZWV0aW5nc10oI3NlYzUuMykNCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPlN1cGVyaW50ZW5kZW50IHJlc3BvbnNlcyBpbmRpY2F0ZSB0aGF0IHRoZXkgYXJlIG1vbml0b3Jpbmcgc3R1ZGVudCBvdXRjb21lcyBvbiBhIHF1YXJ0ZXJseSAtIG1vbnRobHkgYmFzaXNdKCNzZWM1LjQpDQogICAgKyBbPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5Nb3N0IHJlc3BvbmRlbnRzIGFncmVlIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBCb2FyZCBhbmQgc3VwZXJpbnRlbmRlbnQgaXMgY29sbGFib3JhdGl2ZSB0byBhY2NvbXBsaXNoIHN0dWRlbnQgb3V0Y29tZSBnb2FscywgYnV0IGRvIG5vdCBmZWVsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIEJvYXJkIG1lbWJlcnMgdG8gZ2l2ZSBpbnN0cnVjdGlvbiB0byBzdGFmZiBtZW1iZXJzXSgjc2VjNS41KQ0KICAgICsgWzxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+U3VwZXJpbnRlbmRlbnQgb3BpbmlvbnMgb2YgdGhlIExTRyB3b3Jrc2hvcCB3ZXJlIGdyZWF0IV0oI3NlYzUuNikNCjxicj48YnI+DQoqICBbPGI+PHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5Db21wYXJpc29uIHJlc3VsdHM6IFNjaG9vbCBib2FyZCBtZW1iZXJzIHZzLiBTdXBlcmludGVuZGVudHM8L2I+XSgjc2VjbmV3KTxmb250IHNpemU9IjMiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPio8L3NwYW4+PC9mb250Pg0KICAgICsgWzxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+U3VwZXJpbnRlbmRlbnRzIHBlcmNlaXZlIHN0dWRlbnRzIGhhdmUgbW9yZSB0aGFuIHRoZWlyIFNCTSBjb3VudGVycGFydF0oI3NlY25ldy4yKQ0KICAgICsgWzxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+U3VwZXJpbnRlbmRlbnRzIHBlcmNlaXZlIHNjaG9vbCBzY2hvb2wgYm9hcmQgZGlzY3Vzc2lvbnMgdG8gYmUgc2xpZ2h0bHkgbGVzcyBob25lc3QgYW5kIHJlc3BlY3RmdWwgdGhhbiBTQk1dKCNzZWNuZXcuMykNCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPkJvdGggcGFydGllcyBhZ3JlZSB0aGF0IHRoZSBzY2hvb2wgYm9hcmQgYXJlIG1vbml0b3Jpbmcgc3R1ZGVudCBvdXRjb21lcyBvbiBhIHF1YXJ0ZXJseSAtIG1vbnRobHkgYmFzaXNdKCNzZWNuZXcuNCkNCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPlN1cGVyaW50ZW5kZW50cyBzbGlnaHRseSBkaXNhZ3JlZSB0aGF0IHRoZXkgYXJlIGdpdmVuIHRoZSBhdXRob3JpdHkgdG8gYWNjb21wbGlzaCBzdHVkZW50IHZpc2lvbnMgYW5kIGdvYWxzXSgjc2VjbmV3LjUpDQogICAgKyBbPHNwYW4gc3R5bGU9ImNvbG9yOmRhcmtibHVlIj5Cb3RoIHJvbGUgdHlwZXMgaGFkIGdyZWF0IG9waW5pb25zIG9mIHRoZSBMU0cgd29ya3Nob3AhXSgjc2VjbmV3LjYpDQo8YnI+PGJyPg0KKiAgWzxiPjxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+R29hbCAmIFZpc2lvbiBkZXZlbG9wbWVudCByZXN1bHRzIChTdXBlcmludGVuZGVudHMgJiBTQk1zKTwvYj5dKCNzZWM2KTxmb250IHNpemU9IjMiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPio8L3NwYW4+PC9mb250Pg0KICAgICsgWzxzcGFuIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZSI+OTQlIG9mIHJlc3BvbmRlbnRzIGluZGljYXRlIHRoZWlyIHNjaG9vbCBib2FyZCBoYXMgYSB2aXNpb24gZm9yIExFQV0oI3NlYzYuMSkNCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPjk3JSBvZiByZXNwb25kZW50cyBpbmRpY2F0ZSB0aGVpciBzY2hvb2wgYm9hcmQgaGFzIGdvYWxzIHJlbGF0ZWQgdG8gc3R1ZGVudCBvdXRjb21lc10oI3NlYzYuMikNCiAgICArIFs8c3BhbiBzdHlsZT0iY29sb3I6ZGFya2JsdWUiPkNsaWNrIGhlcmUgdG8gc2VlIHNvbWUgb2YgdGhlIGdvYWxzIHRoYXQgaGF2ZSBiZWVuIGRldmVsb3BlZF0oI3NlYzYuMi4xKQ0KDQo8Zm9udCBzaXplPSIzIj48c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4qPC9zcGFuPjwvZm9udD4gPSBUbyBiZSBkaXNjdXNzZWQgaW4gbWVldGluZy4NCmBgYHtyLCBlY2hvID0gRkFMU0V9DQojQ2xlYXIgRW52aXJvbm1lbnQNCnJtKGxpc3Q9bHMoKSkNCmBgYA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG89IEZBTFNFfQ0KI0xvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocHN5Y2ggICAgKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KERUKQ0KYGBgDQoNCg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCiNTdXJ2ZXkgTW9ua2V5IGNyZWF0ZXMgdGVycmlibGUgZGF0YXNldHMuIEkgd2lsbCBiZSBpbXBvcnRpbmcgbXkgb3duIGN1c3RvbSBsaXN0IG9mIHZhcmlhYmxlIG5hbWVzLiANCg0KI1JlYWQgaW4gZGF0YSBEb24ndCBpbmNsdWRlIGZpcnN0IHR3byByb3dzDQoNCiNjb2RlYm9vaw0KdmFybmFtZXMgPC0gcmVhZF9jc3YoInZhcm5hbWVzLmNzdiIpIA0KDQojY29sdW1uIG5hbWVzIChmaXJzdCBjb2x1bW4gb2YgY29kZWJvb2spDQpjb2xfbmFtZSA8LSB2YXJuYW1lcyAlPiUgDQogIHNlbGVjdCh2YXJuYW1lKSAlPiUgDQogIGFzLm1hdHJpeCgpICAgICAgICAgICAjbmVlZHMgdG8gYmUgYSBjaGFyYWN0ZXIgdmVjdG9yLg0KDQoNCiNsb2FkIHN1cnZleSwgc2tpcCBmaXJzdCAyIGxpbmVzLCBpbnB1dCBjb2RlYm9vayBjb2x1bW4gbmFtZXMuDQpzdXJ2ZXkgICA8LSByZWFkX2NzdigiTFNHIFN1cnZleSBEYXRhLmNzdiIsIHNraXAgPSAyLCBjb2xfbmFtZXMgPSBjb2xfbmFtZSkgI1NraXAgZmlyc3QgdHdvIGNvbHVtbnMgYW5kIGFkZCBpbiBuZXcgdmFyaWFibGUgbmFtZXMgKFNlZSB2YXJuYW1lcyBkYXRhc2V0IHRvIG1hdGNoIHZhcm5hbWUgdG8gcXVlc3Rpb24gdGV4dCkNCg0KI0Rpc3RyaWN0IG5hbWVzIHRvIG1hdGNoDQpkaXN0cmljdHMgPC0gcmVhZF9jc3YoImRpc3RyaWN0bWF0Y2guY3N2IikNCg0Kcm0oY29sX25hbWUpDQoNCmBgYA0KDQoNCmBgYHtyLCBlY2hvID0gRkFMU0V9DQoNCiN2YXJuYW1lcw0KDQpgYGANCg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCiNSZXZlcnNlIGNvZGUgZnVuY3Rpb24gLSBMaWtlcnQ6IE1pbiA9IDEsIE1heCA9IDQuDQpyZXZlcnNlXzQgPC0gZnVuY3Rpb24oeCl7KDUteCl9IA0KYGBgDQoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoNCg0Kc3VydmV5IDwtIHN1cnZleSAlPiUgDQogbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMuZmFjdG9yKSAlPiUgDQogbXV0YXRlKGBSZXNwb25kZW50IElEYCA9IGFzLmNoYXJhY3RlcihgUmVzcG9uZGVudCBJRGApKSAjY29lcmNlIElEIGludG8gY2hhcmFjdGVyIChTbyB3ZSBjYW4ndCBtYXRoIGl0IGFsbCB1cCkNCg0KdG9wcyA8LSBzdXJ2ZXkgJT4lIA0KICBzZWxlY3QoYFJlc3BvbmRlbnQgSURgLCBzdGFydHNfd2l0aCgidG9waWNzXyIpKSAjdG9waWNzID0gSGF2ZSBtZWV0aW5nIGZyZXF1ZW5jeSByZXNwb25zZXMNCg0KDQp0b3BzIDwtIHRvcHMgJT4lIA0KICBtdXRhdGVfaWYoDQogICAgICAgICAgICBpcy5mYWN0b3IsIGZhY3RvciwgDQogICAgICAgICAgICBsZXZlbHMgPSBjKCJJbiBldmVyeSBtZWV0aW5nIiwgIkluIG1vc3QgbWVldGluZ3MiLCAiSW4gYSBmZXcgbWVldGluZ3MiLCAiSW4gbm8gbWVldGluZ3MiKSwgI01ha2luZyBzdXJlIGxldmVscyBhcmUgc2V0IGNvcnJlY3RseQ0KICAgICAgICAgICAgbGFiZWxzID0gYygxLDIsMyw0KQ0KICAgICAgICAgICAgKSAlPiUgDQojICBkcGx5cjo6bmFfaWYoOTkpICU+JSAgICAgICAgICAgICAgICAgICAgICAjOTkgPSBOQS4NCiAgbXV0YXRlX2lmKGlzLmZhY3RvciwgYXMubnVtZXJpYykgJT4lICAgICAgICNUdXJuIGFsbCBpbnRvIG51bWVyaWMgYmVmb3JlIEkgcmV2ZXJzZSBzY29yZQ0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcmV2ZXJzZV80KSAjJT4lICAgICAgI1JldmVyc2Ugc2NvcmUgKHJlZmVyIHRvIHByZXZpb3VzbHkgY3JlYXRlZCAicmV2ZXJzZV9hZ3JlZXMiIGZ1bmN0aW9uKQ0KICMgbXV0YXRlX2lmKA0KICMgICAgICAgICAgIGlzLm51bWVyaWMsIGZhY3RvciwgDQogIyAgICAgICAgICAgbGV2ZWxzID0gYyg0LDMsMiwxKSwNCiAjICAgICAgICAgICBsYWJlbHMgPSBjKCJJbiBldmVyeSBtZWV0aW5nIiwgIkluIG1vc3QgbWVldGluZ3MiLCAiSW4gYSBmZXcgbWVldGluZ3MiLCAiSW4gbm8gbWVldGluZ3MiKSAjTWFraW5nIHN1cmUgbGV2ZWxzIGFyZSBzZXQgY29ycmVjdGx5DQogIyAgICAgICAgICAgKQ0KDQoNCg0KIyMjIyMjIyMjIyMjNCA9IHN0cm9uZ2x5IGFncmVlLCAzID0gQWdyZWUsIDIgPSBEaXNhZ3JlZSwgMSA9IFN0cm9uZ2x5IGRpc2FncmVlLiMjIyMjIyMjIyMjIyMjIyMNCg0KI01lcmdlIGFncmVlIGl0ZW1zIGJhY2sgaW50byBzdXJ2ZXkNCnN1cnZleSA8LSBzdXJ2ZXkgJT4lIA0KICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0b3BpY3NfIikpICU+JSAgICAgICAgICAgICAgICAgICAgI1JlbW92ZSBvbGQgb25lcyBmaXJzdA0KICBsZWZ0X2pvaW4odG9wcywgYnkgPSAiUmVzcG9uZGVudCBJRCIpICAgICAgICAgICAgICAgICAgI0pvaW4gaW4gdGhlIG5ldyBvbmVzLg0KICANCmBgYA0KDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQpzdXJ2ZXkgPC0gc3VydmV5ICU+JSANCiBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5mYWN0b3IpICU+JSANCiBtdXRhdGUoYFJlc3BvbmRlbnQgSURgID0gYXMuY2hhcmFjdGVyKGBSZXNwb25kZW50IElEYCkpICNjb2VyY2UgSUQgaW50byBjaGFyYWN0ZXIgKFNvIHdlIGNhbid0IG1hdGggaXQgYWxsIHVwKQ0KDQphZ3JlZXMgPC0gc3VydmV5ICU+JSANCiAgc2VsZWN0KGBSZXNwb25kZW50IElEYCwgc3RhcnRzX3dpdGgoImFncmVlXyIpLCBzdGFydHNfd2l0aCgicHJvY18iKSkgIyJhZ3JlZXNfIiBhbmQgInByb2NfIiB2YXJpYWJsZXMgYXJlIGFsbCBhZ3JlZSBsaWtlcnQgaXRlbXMuDQoNCg0KDQphZ3JlZXMgPC0gYWdyZWVzICU+JSANCiAgbXV0YXRlX2lmKA0KICAgICAgICAgICAgaXMuZmFjdG9yLCBmYWN0b3IsIA0KICAgICAgICAgICAgbGV2ZWxzID0gYygiU3Ryb25nbHkgQWdyZWUiLCAiQWdyZWUiLCAiRGlzYWdyZWUiLCAiU3Ryb25nbHkgRGlzYWdyZWUiLCAiTm90IEFwcGxpY2FibGUiKSwgI01ha2luZyBzdXJlIGxldmVscyBhcmUgc2V0IGNvcnJlY3RseQ0KICAgICAgICAgICAgbGFiZWxzID0gYygxLDIsMyw0LCA5OSkNCiAgICAgICAgICAgICkgJT4lIA0KICBkcGx5cjo6bmFfaWYoOTkpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICM5OSA9IE5BLg0KICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBhcy5udW1lcmljKSAlPiUgICAgICAgICNUdXJuIGFsbCBpbnRvIG51bWVyaWMgYmVmb3JlIEkgcmV2ZXJzZSBzY29yZQ0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcmV2ZXJzZV80KSAlPiUgICAgICAgICNSZXZlcnNlIHNjb3JlIChyZWZlciB0byBwcmV2aW91c2x5IGNyZWF0ZWQgInJldmVyc2VfYWdyZWVzIiBmdW5jdGlvbikNCiAgbXV0YXRlKHByb2NfcHJpb3IgPSA1IC0gcHJvY19wcmlvcikgIyU+JSAgICAjSSBhbSByZXZlcnNpbmcgdGhpcyBiYWNrIGJlY2F1c2UgaXQgaXMgd29yZGVkIG5lZ2F0aXZlbHkuLi4gc28gaGlnaGVyIHZhbHVlcyA9IGJldHRlciANCiAgI3NlbGVjdCgtcHJvY19wcmlvcikgICAgICAgICAgICAgICAgICAgICAgICAjUmVtb3ZpbmcgdGhlIG9yaWdpbmFsDQojIyMjIyMjIyMjIyM0ID0gc3Ryb25nbHkgYWdyZWUsIDMgPSBBZ3JlZSwgMiA9IERpc2FncmVlLCAxID0gU3Ryb25nbHkgZGlzYWdyZWUuIyMjIyMjIyMjIyMjIyMjIw0KDQoNCg0KI01lcmdlIGFncmVlIGl0ZW1zIGJhY2sgaW50byBzdXJ2ZXkNCnN1cnZleSA8LSBzdXJ2ZXkgJT4lIA0KICBzZWxlY3QoLXN0YXJ0c193aXRoKCJhZ3JlZV8iKSwgLXN0YXJ0c193aXRoKCJwcm9jXyIpKSAlPiUgI1JlbW92ZSBvbGQgb25lcyBmaXJzdA0KICBsZWZ0X2pvaW4oYWdyZWVzLCBieSA9ICJSZXNwb25kZW50IElEIikgICAgICAgICAgICAgICAgICAgI0pvaW4gaW4gdGhlIG5ldyBvbmVzLg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0Kc3RhayA8LSBzdXJ2ZXkgJT4lIA0KICBzZWxlY3QoYFJlc3BvbmRlbnQgSURgLCBzdGFydHNfd2l0aCgic3RhayIpKSAjImFncmVlc18iIGFuZCAicHJvY18iIHZhcmlhYmxlcyBhcmUgYWxsIGFncmVlIGxpa2VydCBpdGVtcy4NCg0KDQoNCnN0YWsgPC0gc3RhayAlPiUgDQogIG11dGF0ZV9pZigNCiAgICAgICAgICAgIGlzLmZhY3RvciwgZmFjdG9yLCANCiAgICAgICAgICAgIGxldmVscyA9IGMoIk5vIElucHV0IiwgIkxpbWl0ZWQgSW5wdXQiLCAiTW9kZXJhdGUgSW5wdXQiLCAiU3Vic3RhbnRpYWwgSW5wdXQiKSwgI01ha2luZyBzdXJlIGxldmVscyBhcmUgc2V0IGNvcnJlY3RseQ0KICAgICAgICAgICAgbGFiZWxzID0gYygxLDIsMyw0KQ0KICAgICAgICAgICAgKSAlPiUgDQogICNkcGx5cjo6bmFfaWYoOTkpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICM5OSA9IE5BLg0KICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBhcy5udW1lcmljKSAjJT4lICAgICAgICAjVHVybiBhbGwgaW50byBudW1lcmljIGJlZm9yZSBJIHJldmVyc2Ugc2NvcmUNCiMgIG11dGF0ZV9pZihpcy5udW1lcmljLCByZXZlcnNlXzQpICAgICAgICAgICAgI1JldmVyc2Ugc2NvcmUgKHJlZmVyIHRvIHByZXZpb3VzbHkgY3JlYXRlZCAicmV2ZXJzZV9hZ3JlZXMiIGZ1bmN0aW9uKQ0KDQoNCnN1cnZleSA8LSBzdXJ2ZXkgJT4lIA0KICBzZWxlY3QoLXN0YXJ0c193aXRoKCJzdGFrIikpICU+JSAgICAgICAgICAjUmVtb3ZlIG9sZCBvbmVzIGZpcnN0DQogIGxlZnRfam9pbihzdGFrLCBieSA9ICJSZXNwb25kZW50IElEIikgICAgICNKb2luIGluIHRoZSBuZXcgb25lcy4NCg0KYGBgDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZW5nYWdlIDwtIHN1cnZleSAlPiUgDQogIHNlbGVjdChgUmVzcG9uZGVudCBJRGAsIHN0YXJ0c193aXRoKCJlbmdhZ2UiKSkgIyJhZ3JlZXNfIiBhbmQgInByb2NfIiB2YXJpYWJsZXMgYXJlIGFsbCBhZ3JlZSBsaWtlcnQgaXRlbXMuDQoNCg0KZW5nYWdlIDwtIGVuZ2FnZSAlPiUgDQogIG11dGF0ZV9pZigNCiAgICAgICAgICAgIGlzLmZhY3RvciwgZmFjdG9yLCANCiAgICAgICAgICAgIGxldmVscyA9IGMoIkFubnVhbGx5IiwgIkJpLUFubnVhbGx5IiwgIlF1YXJ0ZXJseSIsICJNb250aGx5IiwgIkRvbid0IEtub3ciKSwgI01ha2luZyBzdXJlIGxldmVscyBhcmUgc2V0IGNvcnJlY3RseQ0KICAgICAgICAgICAgbGFiZWxzID0gYyg0LDMsMiwxLCA5OSkNCiAgICAgICAgICAgICkgJT4lIA0KICBkcGx5cjo6bmFfaWYoOTkpICU+JSAgICAgICAgICAgICAgICAgICAgICAjOTkgPSBOQS4NCiAgbXV0YXRlX2lmKGlzLmZhY3RvciwgYXMubnVtZXJpYykNCg0KIyMjIyMjIyMjIyMjNCA9ICIiSW4gZXZlcnkgbWVldGluZyIsLCAzID0gIkluIG1vc3QgbWVldGluZ3MiLCAyID0gIkluIGEgZmV3IG1lZXRpbmdzIiwgMSA9ICJJbiBubyBtZWV0aW5ncyIgIyMjIyMjIyMjIyMjIyMjIw0KDQoNCg0Kc3VydmV5IDwtIHN1cnZleSAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoImVuZ2FnZSIpKSAlPiUgICAgICAgICAgI1JlbW92ZSBvbGQgb25lcyBmaXJzdA0KICBsZWZ0X2pvaW4oZW5nYWdlLCBieSA9ICJSZXNwb25kZW50IElEIikgICAgICNKb2luIGluIHRoZSBuZXcgb25lcy4NCmBgYA0KDQpgYGB7ciwgZWNobz0gRkFMU0UsIHJlc3VsdHM9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiMNCiNzdXJ2ZXkgJT4lIA0KIyAgc2VsZWN0KHN0YXJ0c193aXRoKCJhZ3JlZV8iKSwgc3RhcnRzX3dpdGgoInByb2NfIikpICU+JSANCiMgIGRlc2NyaWJlKCkNCiMNCiMNCiNzdXJ2ZXkgJT4lIA0KIyAgc2VsZWN0KHJvbGUsIHN0YXJ0c193aXRoKCJhZ3JlZV8iKSkgJT4lIA0KIyAgZmlsdGVyKCFpcy5uYShyb2xlKSkgJT4lIA0KIyAgZ3JvdXBfYnkocm9sZSkgJT4lIA0KIyAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuKSwgbmEucm0gPSBUUlVFKQ0KDQoNCmBgYA0KDQoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQojVmlldyB0aGUgZGF0YSAtIGhhcyB0ZXh0DQojc3VydmV5ICU+JSBzZWxlY3QoeWVhcnMpDQoNCiNOZWVkIHRvIHJlbW92ZToNCiAgI3llYXJzLCB5ZWFyLCB5ciwgbW9udGhzLCAgbW9udGgNCg0Kc3VydmV5IDwtIHN1cnZleSAlPiUgDQogIG11dGF0ZSgNCiAgICAgICAgIHllYXJzID0gc3RyX3JlbW92ZV9hbGwoeWVhcnMsICJ5ZWFycyIgKSwgI05lZWRzIHRvIGNvbWUgYmVmb3JlICJ5ZWFyIg0KICAgICAgICAgeWVhcnMgPSBzdHJfcmVtb3ZlX2FsbCh5ZWFycywgInllYXIiICApLA0KICAgICAgICAgeWVhcnMgPSBzdHJfcmVtb3ZlX2FsbCh5ZWFycywgInlyIiAgICApLA0KICAgICAgICAgeWVhcnMgPSBzdHJfcmVtb3ZlX2FsbCh5ZWFycywgIm1vbnRocyIpLCAjTmVlZHMgdG8gY29tZSBiZWZvcmUgIm1vbnRoIg0KICAgICAgICAgeWVhcnMgPSBzdHJfcmVtb3ZlX2FsbCh5ZWFycywgIm1vbnRoIiApLA0KICAgICAgICAgDQogICAgICAjQ3VzdG9tIHJlbW92YWxzDQogICAgICAgICANCiAgICAgICAgIHllYXJzID0gaWZlbHNlKHllYXJzICAgICAgICAgICA9PSAiKDIpIFR3byIgICAgICAgLCAyLCB5ZWFycyksDQogICAgICAgICB5ZWFycyA9IGlmZWxzZSh5ZWFycyAgICAgICAgICAgPT0gIkZpdmUiICAgICAgICAgICwgNSwgeWVhcnMpLA0KICAgICAgICAgeWVhcnMgPSBpZmVsc2UoeWVhcnMgICAgICAgICAgID09ICJMZXNzIHRoYW4gYSAuIiAsIDAsIHllYXJzKSwNCiAgICAgICAgIHllYXJzID0gaWZlbHNlKHllYXJzICAgICAgICAgICA9PSAiMiAxLzIiICAgICAgICAgLCAyLCB5ZWFycyksDQogICAgICAgICB5ZWFycyA9IGlmZWxzZSh5ZWFycyAgICAgICAgICAgPT0gIlRocmVlIiAgICAgICAgICwgMywgeWVhcnMpLA0KICAgICAgDQogICAgICAgICB5ZWFycyA9IGlmZWxzZShgUmVzcG9uZGVudCBJRGAgPT0gMTA4MDU4ODU1NzYgICAgICwgNywgeWVhcnMpLCAjQ291bGQgbm90IGZvciB0aGUgbGlmZSBvZiBtZSBtYXRjaCB0aGUgYWN0dWFsIHN0cmluZyx0aGVyZWZvcmUgcmVtb3ZpbmcgYmFzZWQgb24gcmVzcG9uZGVudCBpZA0KICAgICAgICAgeWVhcnMgPSBpZmVsc2UoYFJlc3BvbmRlbnQgSURgID09IDEwNzc2NzM3NzQ3ICAgICAsIDMsIHllYXJzKSwgI0NvdWxkIG5vdCBmb3IgdGhlIGxpZmUgb2YgbWUgbWF0Y2ggdGhlIGFjdHVhbCBzdHJpbmcsdGhlcmVmb3JlIHJlbW92aW5nIGJhc2VkIG9uIHJlc3BvbmRlbnQgaWQNCiAgICAgICAgIHllYXJzID0gaWZlbHNlKGBSZXNwb25kZW50IElEYCA9PSAxMDgxNDMyODI1NiAgICAgLCA1LCB5ZWFycyksICNDb3VsZCBub3QgZm9yIHRoZSBsaWZlIG9mIG1lIG1hdGNoIHRoZSBhY3R1YWwgc3RyaW5nLHRoZXJlZm9yZSByZW1vdmluZyBiYXNlZCBvbiByZXNwb25kZW50IGlkDQogICAgICANCiAgICAgICNDb252ZXJ0IHRvIG51bWVyaWMsIHJvdW5kLCBhbmQgdG8gZGJsIGNsYXNzICh0aWR5dmVyc2UncyBhcy5udW1lcmljIGVxdWl2YWxhbnQpDQogICAgICAgICANCiAgICAgICAgIHllYXJzID0gYXMuZG91YmxlKHllYXJzKSwNCiAgICAgICAgIHllYXJzID0gcm91bmQoeWVhcnMsIDApDQogICAgICApDQoNCmBgYA0KDQoNCmBgYHtyLCBlY2hvID0gRkFMU0V9DQojRm9ybWF0IENsYXNzIHNpemUNCg0KDQpzdXJ2ZXkgPC0gc3VydmV5ICU+JSANCiAgbXV0YXRlKGJvYXJkX21lZXRzID0gc3RyX3JlbW92ZV9hbGwoYm9hcmRfbWVldHMsICJNb3JlIHRoYW4gIiApLA0KICAgICAgICAgYm9hcmRfbWVldHMgPSBhcy5udW1lcmljKGJvYXJkX21lZXRzKSwNCiAgICAgICAgIA0KICAgICAgICAgYmluX2JvYXJkX21lZXRzID0gaWZlbHNlKGJvYXJkX21lZXRzIDwgOCwgIkxlc3MgdGhhbiA4IHRpbWVzIiwgTkEpLA0KICAgICAgICAgYmluX2JvYXJkX21lZXRzID0gaWZlbHNlKGJvYXJkX21lZXRzID4gNyAmIGJvYXJkX21lZXRzIDwgMTIsICI4IC0gMTEgdGltZXMiLCBiaW5fYm9hcmRfbWVldHMpLA0KICAgICAgICAgYmluX2JvYXJkX21lZXRzID0gaWZlbHNlKGJvYXJkX21lZXRzID4gMTEsICIxMiBvciBtb3JlIHRpbWVzIiwgYmluX2JvYXJkX21lZXRzKSwNCiAgICAgICAgIGJpbl9ib2FyZF9tZWV0cyA9IGlmZWxzZShpcy5uYShib2FyZF9tZWV0cyksICJObyByZXNwb25zZSIsIGJpbl9ib2FyZF9tZWV0cyksDQogICAgICAgICBiaW5fYm9hcmRfbWVldHMgPSBmYWN0b3IoYmluX2JvYXJkX21lZXRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkxlc3MgdGhhbiA4IHRpbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4IC0gMTEgdGltZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEyIG9yIG1vcmUgdGltZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJlc3BvbnNlIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICApDQoNCmBgYA0KDQoNCg0KI1N1cnZleSBSZXNwb25zZSBkZXNjcmlwdGl2ZXMgeyNzZWMzfSANCiMjQXBwbGljYWJsZSByZXNwb25zZXMNCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQphcHBfcmVzcG9uc2VzIDwtIHN1cnZleSAlPiUgDQogIHNlbGVjdChjb25zZW50LCByb2xlKSAlPiUgDQogIGZpbHRlcihjb25zZW50ID09ICJZZXMsIEkgYWdyZWUgdG8gcGFydGljaXBhdGUuIiwgIWlzLm5hKHJvbGUpKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IDEpICU+JSANCiAgc3VtbWFyaXplKE4gPSBzdW0oY291bnQpKSAlPiUgDQogIG11dGF0ZShgVHlwZSBvZiBSZXNwb25zZWAgPSAiQW5zd2VyZWQgYXQgbGVhc3QgMSBpdGVtIG9uIHN1cnZleSIpDQoNCm5vbl9jb25zZW50IDwtIHN1cnZleSAlPiUgDQogIHNlbGVjdChjb25zZW50LCByb2xlKSAlPiUgDQogIGZpbHRlcihjb25zZW50ICE9ICJZZXMsIEkgYWdyZWUgdG8gcGFydGljaXBhdGUuIikgJT4lIA0KICBtdXRhdGUoY291bnQgPSAxKSAlPiUgDQogIHN1bW1hcml6ZShOID0gc3VtKGNvdW50KSkgJT4lIA0KICBtdXRhdGUoYFR5cGUgb2YgUmVzcG9uc2VgID0gIkRpZCBub3QgY29uc2VudCB0byBzdXJ2ZXkiKQ0KDQpub19maWxsIDwtIHN1cnZleSAlPiUgDQogIHNlbGVjdChjb25zZW50LCByb2xlKSAlPiUgDQogIGZpbHRlcihjb25zZW50ID09ICJZZXMsIEkgYWdyZWUgdG8gcGFydGljaXBhdGUuIiwgaXMubmEocm9sZSkpICU+JSANCiAgbXV0YXRlKGNvdW50ID0gMSkgJT4lIA0KICBzdW1tYXJpemUoTiA9IHN1bShjb3VudCkpICU+JSANCiAgbXV0YXRlKGBUeXBlIG9mIFJlc3BvbnNlYCA9ICJDb25zZW50ZWQsIGJ1dCBkaWQgbm90IGZpbGwgb3V0IHN1cnZleSIpDQoNCm5vdGhpbmcgPC0gc3VydmV5ICU+JSANCiAgc2VsZWN0KGNvbnNlbnQsIHJvbGUpICU+JSANCiAgZmlsdGVyKGlzLm5hKGNvbnNlbnQpKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IDEpICU+JSANCiAgc3VtbWFyaXplKE4gPSBzdW0oY291bnQpKSAlPiUgDQogIG11dGF0ZShgVHlwZSBvZiBSZXNwb25zZWAgPSAiT3BlbmVkIHN1cnZleSwgYnV0IGRpZCBub3QgcmVzcG9uZCIpDQoNCg0KcmVzcG9uc2VfdHlwZSA8LSBiaW5kX3Jvd3MoYXBwX3Jlc3BvbnNlcywgbm9uX2NvbnNlbnQsIG5vX2ZpbGwsIG5vdGhpbmcpDQoNCg0KDQoNCnAxIDwtIGdncGxvdChkYXRhID0gcmVzcG9uc2VfdHlwZSwgYWVzKHggPSBgVHlwZSBvZiBSZXNwb25zZWAsIHkgPSBOLCBmaWxsID0gYFR5cGUgb2YgUmVzcG9uc2VgKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZ3RpdGxlKCJUeXBlcyBvZiBzdXJ2ZXkgcmVzcG9uc2UgKE4gPSAxNDMpIikrDQogIHlsYWIoIk51bWJlciBvZiByZXNwb25zZXMiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDAsIDEzMCwgMTApLCBleHBhbmQgPSBleHBhbmRfc2NhbGUobXVsdCA9IGMoMCwgLjAxKSkpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIA0KICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpIywNCiAgICAgICAgICNheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICkNCg0KZ2dwbG90bHkocDEpDQoNCg0KDQpgYGANCg0KPGJyPg0KPGZvbnQgc2l6ZT0iNiI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPiBgciBwYXN0ZShhcHBfcmVzcG9uc2VzJE4pYCBhcHBsaWNhYmxlIHJlc3BvbnNlcyB0byB0aGUgTFNHIHN1cnZleSA8L3NwYW4+PC9mb250Pg0KPGJyPg0KDQpUaGVyZSBhcmUgYHIgcGFzdGUobnJvdyhzdXJ2ZXkpKWAgc3VydmV5IHJlc3BvbmRlbnQocykgaW4gdGhlIGRhdGFzZXQuIGByIHBhc3RlKG5vX2ZpbGwkTilgIHJlc3BvbmRlbnQocykgY29uc2VudGVkLCBidXQgZGlkIG5vdCBmaWxsIG91dCB0aGUgc3VydmV5LiBgciBwYXN0ZShub25fY29uc2VudCROKWAgcmVzcG9uZGVudChzKSBkaWQgbm90IGNvbnNlbnQgdG8gdGhlIHN1cnZleS4gYHIgcGFzdGUobm90aGluZyROKWAgcmVzcG9uZGVudChzKSBvcGVuZWQgdGhlIHN1cnZleSwgYnV0IGRpZCBub3QgZmlsbCBvdXQgYW55IHBvcnRpb24uIFRoZXJlZm9yZSwgdGhlcmUgd2VyZSBhIHRvdGFsIG9mIGByIHBhc3RlKGFwcF9yZXNwb25zZXMkTilgIGFwcGxpY2FibGUgcmVzcG9uc2VzIHRvIHRoZSBMU0cgc3VydmV5Lg0KPGJyPg0KPGJyPg0KKipQbGVhc2Ugbm90ZSB0aGF0LCBvZiB0aGVzZSAxMjkgcmVzcG9uZGVudHMsIDI0JSBvZiByZXNwb25kZW50cyBjb21wbGV0ZWQgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+bGVzcyB0aGFuIGhhbGYgb2YgdGhlIHN1cnZleTwvc3Bhbj4qKg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoNCnJlc3BvbnNlcyA8LSBzdXJ2ZXkgJT4lIA0KICAgZmlsdGVyKGNvbnNlbnQgPT0gIlllcywgSSBhZ3JlZSB0byBwYXJ0aWNpcGF0ZS4iLCAhaXMubmEocm9sZSkpICU+JSANCiAgIHNlbGVjdCg4OjEyLCAyMzo0NykNCiAgDQogIA0Kbl9uYSA8LSBlbmZyYW1lKDEgLSByb3dTdW1zKGlzLm5hKHJlc3BvbnNlcykvbmNvbChyZXNwb25zZXMpKSkNCg0Kbl9uYSA8LSBuX25hICU+JSANCiAgbXV0YXRlKGAlIG9mIHN1cnZleSBjb21wbGV0ZWRgID0gaWZlbHNlKHZhbHVlIDwgLjUwLCAnPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+PGI+TGVzcyB0aGFuIDUwJSBjb21wbGV0ZWQ8L2I+PC9zcGFuPicsICc8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPjxiPiBBdCBsZWFzdCA1MCUgY29tcGxldGVkIDwvYj48L3NwYW4+JykpICU+JSANCiAgZ3JvdXBfYnkoYCUgb2Ygc3VydmV5IGNvbXBsZXRlZGApICU+JSANCiAgc3VtbWFyaXplKE4gPSBuKCkpDQoNCg0KDQpuX25hICU+JSANCiAgRFQ6OmRhdGF0YWJsZShlc2NhcGUgPSBGQUxTRSwgb3B0aW9ucyA9IGxpc3QoY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtbGVmdCcsIHRhcmdldHMgPSAiX2FsbCIpKSkpDQoNCmBgYA0KDQojIyNEaXN0cmljdHMgd2l0aG91dCBzdXJ2ZXkgcmVzcG9uc2VzDQoNCjxicj4NCjxmb250IHNpemU9IjYiPiAqKlRoZSBmb2xsb3dpbmcgZGlzdHJpY3RzIGRpZCBub3QgcHJvdmlkZSBhbnkgcmVzcG9uc2VzIHRvIHRoZSBzdXJ2ZXk6KiogPC9mb250PiANCjxicj4NCjxicj4NCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KDQoNCg0Kc3VydmV5IDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihjb25zZW50ID09ICJZZXMsIEkgYWdyZWUgdG8gcGFydGljaXBhdGUuIikgJT4lIA0KICBsZWZ0X2pvaW4oZGlzdHJpY3RzLCBieSA9ICJDb2xsZWN0b3JfSUQiKSANCg0KZGlzdGluY3RfZGlzdHMgPC0gdGliYmxlOjplbmZyYW1lKHVuaXF1ZShzdXJ2ZXkkQ29sbGVjdG9yX0lEKSkNCmRpc3RpbmN0X2Rpc3RzIDwtIGRpc3RpbmN0X2Rpc3RzICU+JSANCiAgc2VsZWN0KENvbGxlY3Rvcl9JRCA9ICJ2YWx1ZSIsIGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICByaWdodF9qb2luKGRpc3RyaWN0cywgYnkgPSAiQ29sbGVjdG9yX0lEIikgJT4lIA0KICBmaWx0ZXIoaXMubmEobmFtZSkpDQoNCg0KZGlzdGluY3RfZGlzdHMgJT4lIA0KICBhcnJhbmdlKFRpdGxlKSAlPiUgDQogIG11dGF0ZShUaXRsZSA9IGlmZWxzZShUaXRsZSA9PSAiU291dGh3ZXN0IElTRCIgICwgIlNvdXRod2VzdCBJU0QgKDxiPjxpPk5vdGU6IFJlc3BvbmRlZCB0byBzdXJ2ZXksIGJ1dCBkaWQgbm90IGNvbnNlbnQ8L2k+PC9iPikiLCBUaXRsZSksDQogICAgICAgICBUaXRsZSA9IGlmZWxzZShUaXRsZSA9PSAiTmFjb2dkb2NoZXMgSVNEIiwgIk5hY29nZG9jaGVzIElTRCAoPGI+PGk+Tm90ZTogUmVzcG9uZGVkIHRvIHN1cnZleSwgYnV0IGRpZCBub3QgY29uc2VudDwvaT48L2I+KSIsIFRpdGxlKSkgJT4lIA0KICBzZWxlY3QoYERpc3RyaWN0cyB3aXRoIG5vIHN1cnZleSByZXNwb25zZXNgID0gIlRpdGxlIikgJT4lIA0KICBEVDo6ZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSBucm93KGRpc3RpbmN0X2Rpc3RzKSksIGVzY2FwZSA9IEZBTFNFKQ0KDQoNCiAgDQojU291dGh3ZXN0IElTRAkgIDwtICNObyByZXNwb25zZQkNCiNOYWNvZ2RvY2hlcyBJU0QJPC0gTm8gcmVzcG9uc2VzCQkNCg0KICANCg0KYGBgDQoNCg0KDQoNCg0KIyNSZXNwb25kZW50cyBieSBSb2xlIFR5cGUNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQoNCnJvbGVfcmVzcCA8LSBzdXJ2ZXkgJT4lIA0KICBzZWxlY3QoY29uc2VudCwgYE51bWJlciBvZiByZXNwb25zZXMgYnkgcm9sZWAgPSAicm9sZSIpICU+JSANCiAgZmlsdGVyKGNvbnNlbnQgPT0gIlllcywgSSBhZ3JlZSB0byBwYXJ0aWNpcGF0ZS4iLCAhaXMubmEoYE51bWJlciBvZiByZXNwb25zZXMgYnkgcm9sZWApKSAlPiUgDQogIGdyb3VwX2J5KGBOdW1iZXIgb2YgcmVzcG9uc2VzIGJ5IHJvbGVgKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IDEpICU+JSANCiAgc3VtbWFyaXplKE4gPSBzdW0oY291bnQpKQ0KDQpyb2xlX3Jlc3AgJT4lIA0KICBEVDo6ZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSBucm93KHJvbGVfcmVzcCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdChsaXN0KGNsYXNzTmFtZSA9ICdkdC1sZWZ0JywgdGFyZ2V0cyA9ICJfYWxsIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwgZXNjYXBlID0gRkFMU0UsIHJvd25hbWVzID0gRkFMU0UpDQoNCmBgYA0KDQojU2Nob29sIEJvYXJkIG1lbWJlciByZXN1bHRzIHsjc2VjNH0NCiMjRGVzY3JpcHRpdmVzDQojIyNFeHBlcmllbmNlIGluIHJvbGUgeyNzZWM0LjF9DQo8YmxvY2txdW90ZT4gPGZvbnQgc2l6ZT0iNiI+ICoqKkluIHRvdGFsLCBob3cgbWFueSB5ZWFycyBoYXZlIHlvdSBzZXJ2ZWQgaW4gdGhpcyByb2xlIGZvciB0aGlzIExFQT8qKiogPC9mb250PiA8L2Jsb2NrcXVvdGU+DQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCkJpbl95ZWFycyA8LSBzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIoY29uc2VudCA9PSAiWWVzLCBJIGFncmVlIHRvIHBhcnRpY2lwYXRlLiIsIHJvbGUgPT0gIlNjaG9vbCBCb2FyZCBNZW1iZXIiKSAlPiUgDQogIG11dGF0ZShgeWVhcnMgb2YgZXhwYCA9IGlmZWxzZSh5ZWFycyA8IDMsICJMZXNzIHRoYW4gMyB5ZWFycyBleHBlcmllbmNlIiwgTkEpLA0KICAgICAgICAgYHllYXJzIG9mIGV4cGAgPSBpZmVsc2UoeWVhcnMgPiAyICYgeWVhcnMgPCAxMCwgIjMtIDkgeWVhcnMgZXhwZXJpZW5jZSIsIGB5ZWFycyBvZiBleHBgKSwNCiAgICAgICAgIGB5ZWFycyBvZiBleHBgID0gaWZlbHNlKHllYXJzID4gOSAmIHllYXJzIDwgMjEsICIxMCAtIDIwIHllYXJzIGV4cGVyaWVuY2UiLCBgeWVhcnMgb2YgZXhwYCksDQogICAgICAgICBgeWVhcnMgb2YgZXhwYCA9IGlmZWxzZSh5ZWFycyA+IDIwLCAiMjErIHllYXJzIGV4cGVyaWVuY2UiLCBgeWVhcnMgb2YgZXhwYCksDQogICAgICAgICBgeWVhcnMgb2YgZXhwYCA9IGlmZWxzZShpcy5uYSh5ZWFycyksICJObyByZXNwb25zZSIsIGB5ZWFycyBvZiBleHBgKSwNCiAgICAgICAgIA0KICAgICAgICAgYHllYXJzIG9mIGV4cGAgPSBmYWN0b3IoYHllYXJzIG9mIGV4cGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTGVzcyB0aGFuIDMgeWVhcnMgZXhwZXJpZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMy0gOSB5ZWFycyBleHBlcmllbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIC0gMjAgeWVhcnMgZXhwZXJpZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMSsgeWVhcnMgZXhwZXJpZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyByZXNwb25zZSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgKQ0KDQp5ZWFyX3N1bSA8LSBCaW5feWVhcnMgJT4lIA0KICBncm91cF9ieShgeWVhcnMgb2YgZXhwYCkgJT4lIA0KICBzdW1tYXJpemUoTiA9IG4oKSkNCg0KDQoNCg0KcDEgPC0gZ2dwbG90KGRhdGEgPSB5ZWFyX3N1bSwgYWVzKHggPSBgeWVhcnMgb2YgZXhwYCwgeSA9IE4sIGZpbGwgPSBgeWVhcnMgb2YgZXhwYCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgZ2d0aXRsZSgiUmVzcG9uc2VzIGJ5IHllYXJzIG9mIFNjaG9vbCBCb2FyZCBNZW1iZXIgZXhwZXJpZW5jZSAoTiA9IDEwNSkiLCBzdWJ0aXRsZSA9ICJZZWFycyBvZiBleHBlcmllbmNlIGNhdGVnb3JpZXMgZGVyaXZlZCBmcm9tIERlcHQuIG9mIEVkdWNhdGlvbiBjYXRlZ29yaWVzIikrDQogIHlsYWIoIk51bWJlciBvZiByZXNwb25zZXMiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDAsIDYwLCA1KSwgZXhwYW5kID0gZXhwYW5kX3NjYWxlKG11bHQgPSBjKDAsIC4xKSkpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkjLCANCiAgICAgICAgI3BhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICAjcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpICMsDQogICAgICAgICMgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICApICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoIlllYXJzIG9mIGV4cGVyaWVuY2UiLCB2YWx1ZXMgPSBjKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZXNzIHRoYW4gMyB5ZWFycyBleHBlcmllbmNlIiA9ICIjMDBjZGNkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMtIDkgeWVhcnMgZXhwZXJpZW5jZSIgICAgICAgID0gIiMwMDlhOWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAyMCB5ZWFycyBleHBlcmllbmNlIiAgICAgPSAiIzAwODA4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMSsgeWVhcnMgZXhwZXJpZW5jZSIgICAgICAgICA9ICIjMDA0ZDRkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJlc3BvbnNlIiA9ICJncmV5Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgKSANCg0KDQpnZ3Bsb3RseShwMSkNCg0KYGBgDQoNCg0KIyMjU2Nob29sIGJvYXJkIG1lZXRpbmdzIGF0dGVuZGVkDQo8YmxvY2txdW90ZT4gPGZvbnQgc2l6ZT0iNiI+ICoqKkhvdyBtYW55IHNjaG9vbCBib2FyZCBtZWV0aW5ncyBoYXZlIHlvdSBhdHRlbmRlZCBkdXJpbmcgdGhlIDIwMTgtMTkgc2Nob29sIHllYXIgKGluY2x1ZGluZyBvbmx5IGZ1bGwgc2Nob29sIGJvYXJkIG1lZXRpbmdzIHRoYXQgYXJlIG9wZW4gdG8gdGhlIHB1YmxpYyk/KioqIDwvZm9udD48L2Jsb2NrcXVvdGU+DQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCm1lZXRfc3VtIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihjb25zZW50ID09ICJZZXMsIEkgYWdyZWUgdG8gcGFydGljaXBhdGUuIiwgcm9sZSA9PSAiU2Nob29sIEJvYXJkIE1lbWJlciIpICU+JSANCiAgZ3JvdXBfYnkoYmluX2JvYXJkX21lZXRzKSAlPiUgDQogIHN1bW1hcml6ZShOID0gbigpKSAlPiUgDQogIHJlbmFtZShgIyBvZiBUaW1lcyBhdHRlbmRlZCBib2FyZCBtZWV0aW5nYCA9ICJiaW5fYm9hcmRfbWVldHMiKQ0KDQoNCg0KDQpwMSA8LSBnZ3Bsb3QoZGF0YSA9IG1lZXRfc3VtLCBhZXMoeCA9IGAjIG9mIFRpbWVzIGF0dGVuZGVkIGJvYXJkIG1lZXRpbmdgLCB5ID0gTiwgZmlsbCA9IGAjIG9mIFRpbWVzIGF0dGVuZGVkIGJvYXJkIG1lZXRpbmdgKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZ3RpdGxlKCJSZXNwb25zZXMgYnkgIyBvZiB0aW1lcyBhdHRlbmRlZCBhIHNjaG9vbCBib2FyZCBtZWV0aW5nIChOID0gMTA1KSIpKw0KICB5bGFiKCJOdW1iZXIgb2YgcmVzcG9uc2VzIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMDAsIDEwKSwgZXhwYW5kID0gZXhwYW5kX3NjYWxlKG11bHQgPSBjKDAsIC4xKSkpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkjLCANCiAgICAgICAgI3BhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICAjcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpICMsDQogICAgICAgICMgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICApICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoIk1lZXRpbmdzIGF0dGVuZGVkIiwgdmFsdWVzID0gYygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlc3MgdGhhbiA4IHRpbWVzIiA9ICIjMDBjZGNkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4IC0gMTEgdGltZXMiICAgICAgPSAiIzAwODA4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTIgb3IgbW9yZSB0aW1lcyIgID0gIiMwMDRkNGQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJlc3BvbnNlIiAgICAgICA9ICJncmV5Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICkgDQoNCg0KZ2dwbG90bHkocDEpDQpgYGANCg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiNTZXQgVGFibGUgY29sb3JzDQpjbHJzIDwtIHJvdW5kKHNlcSgxMDAsIDI1MCwgbGVuZ3RoLm91dCA9IGxlbmd0aChjKDAsMSwyLDMsNCkpICsgMSksIDApICU+JQ0Ke3Bhc3RlMCgicmdiKDEwMCwiLCAuLCAiLCIsIC4sICIpIil9DQpgYGANCg0KDQojI0V4dGVudCB0byB3aGljaCBzdGFrZWhvbGRlcnMgcHJvdmlkZSBpbnB1dCB7I3NlYzQuMn0NCg0KPGJyPg0KPGJsb2NrcXVvdGU+IDxmb250IHNpemU9IjYiPiAqKipJbiAyMDE4LTE5LCB0byB3aGF0IGV4dGVudCBoYXZlIHRoZSBmb2xsb3dpbmcgZ3JvdXBzIG9mIHN0YWtlaG9sZGVycyBwcm92aWRlZCBpbnB1dCB0byB0aGUgc2Nob29sIGJvYXJkIHJlZ2FyZGluZyBkZXZlbG9wbWVudCBvZiBnb2FscyBvciB2aXNpb24/KioqPC9mb250PiA8L2Jsb2NrcXVvdGU+DQo8YnI+PGJyPg0KDQpgYGB7ciB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQoNCg0KI1N1bW1hcml6ZSB0byBnZXQgbWVhbiB2YWx1ZXMNCm1lYW5zIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihyb2xlID09ICJTY2hvb2wgQm9hcmQgTWVtYmVyIikgJT4lIA0KICBzZWxlY3QoVGl0bGUsIHN0YXJ0c193aXRoKCJzdGFrIikpICU+JSANCiAgZ3JvdXBfYnkoVGl0bGUpICU+JSANCiAgc3VtbWFyaXNlX2FsbChtZWFuLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMikgJT4lIA0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgic3RhayIpKSAsIGFzLm51bWVyaWMpDQoNCg0Kb3ZlcmFsbF9tZWFuIDwtIG1lYW5zICU+JQ0KICBzdW1tYXJpemVfYXQodmFycygyOmxlbmd0aChtZWFucykpLCBtZWFuLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKFRpdGxlID0gIkF2ZXJhZ2UiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgZXZlcnl0aGluZygpKQ0KDQptZWFucyA8LSAgIGJpbmRfcm93cyhvdmVyYWxsX21lYW4sIG1lYW5zKQ0KDQojRmlsdGVyIHRvIGp1c3QgdmFyaWFibGVzIEkgd2FudA0KbnMgPC0gc3VydmV5ICU+JSANCiAgZmlsdGVyKHJvbGUgPT0gIlNjaG9vbCBCb2FyZCBNZW1iZXIiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgc3RhcnRzX3dpdGgoInN0YWsiKSkgJT4lIA0KICBncm91cF9ieShUaXRsZSkgJT4lIA0KICBzdW1tYXJpemUobiA9IG4oKSkNCg0KI3JvdW5kIGFsbCBudW1lcmljIHZhcmlhYmxlIHRvIDIgZGVjaW1hbCBwbGFjZXMNCm5zIDwtIG5zICU+JSANCiAgcmlnaHRfam9pbihtZWFucywgYnkgPSAiVGl0bGUiKSAlPiUgDQogIG11dGF0ZShuID0gaWZlbHNlKGlzLm5hKG4pLCBzdW0obiwgbmEucm0gPSBUUlVFKSwgbikpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKSANCg0KI0dyYWIgbmFtZXMgZnJvbSAoTmFtZXMgZ2V0IGxvc3QgaW4gdHJhbnNwb3NlKQ0KdGhpcyA8LSBuYW1lcyhucykNCg0KI1RyYW5zcG9zZSAoRmlzdCBjb2x1bW4gbmFtZXMgZ2V0IGxvc3QgZm9yIHNvbWUgcmVhc29uIEkgcmVhbGx5IGRvbid0IHVuZGVyc3RhbmQgd2h5IGRhdGEudGFibGUgZG9lcyB0aGlzLikNCm5zIDwtIG5zICU+JSANCiAgdHJhbnNwb3NlKCkgDQoNCiNSZWludHJvZHVjZSB0aGUgcm93bmFtZXMNCnJvd25hbWVzKG5zKSA8LSB0aGlzDQoNCiNUaGUgZmlyc3Qgcm93IHNob3VsZCBiZSB0aGUgY29sdW1uIG5hbWVzLiBIZXJlLCBJIGFtIG1ha2luZyB0aGF0IGhhcHBlbg0KY29sbmFtZXMobnMpIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QobnNbMSxdKSkgI1B1dCBmaXJzdCByb3cgaW50byBjb2x1bW4gbmFtZXMNCm5zID0gbnNbLTEsIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEZWxldGUgZmlyc3Qgcm93DQoNCiNHcmFiIHRoZSBuYW1lcyB0aGF0IHN0YXJ0IHdpdGgsICJzdGFrIiBmcm9tIHRoZSB2YXJuYW1lcyBsaXN0LiBJIHdhbnQgdG8gcHJlc2VudCB0aGUgaXRlbSB0ZXh0LCByYXRoZXIgdGhhbiB0aGUgdmFyaWFibGUgbmFtZXMuLi4gd2hpY2ggaXMgcHJlc2VudA0KYWdyZWVfbmFtZXMgPC0gdmFybmFtZXMgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdCh2YXJuYW1lLCAic3RhayIpID09IFRSVUUpICU+JSANCiAgc2VsZWN0KHZhcm5hbWUsIE9yaWdfcmVzcCkgDQoNCg0KI05vdyBtZXJnZSB0aGUgYWdyZWUgbmFtZXMgaW50byB0aGUgZGF0c2V0DQpucyA8LSBucyAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSANCiAgbXV0YXRlKHZhcm5hbWUgPSByb3cubmFtZXMobnMpKSAlPiUgDQogIGxlZnRfam9pbihhZ3JlZV9uYW1lcywgYnkgPSAidmFybmFtZSIpICU+JSANCiAgc2VsZWN0KGBJdGVtIHRleHRgID0gIk9yaWdfcmVzcCIsIGV2ZXJ5dGhpbmcoKSwgLXZhcm5hbWUpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKSAlPiUgI1JvdW5kIGV2ZXJ5dGhpbmcgdG8gMiBkaWdpdHMNCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMikgI01ha2Ugc3VyZSBvbmx5IHR3byBkaWdpdHMgZGVzcGxheQ0KDQojVGhpcyBpcyByZWFsbHkgYWxsIGFzdGhldGljLiBJIGRvbid0IHdhbnQgdGhlICMgb2YgcmVzcG9uc2VzIHRvIGhhdmUgdHdvIGRlY2ltYWwgcGxhY2VzLCBzbyBJIG5lZWQgdG8gdGFrZSBpdCBvdXQsIG1hbmlwdWxhdGUgaXQsIHRoZW4gcHV0IGl0IGJhY2sgaW4uIA0KIyNBbHNvLCBJIGtub3cgaXQncyB3ZWlyZCwgYnV0IEknbSBjb252ZXJ0aW5nIHRoaW5ncyBpbnRvIGNoYXJhY3RlciB2YXJpYWJsZXMgZm9yIHByZXNlbnRhdGlvbi4gVGhpcyBtYWtlcyB0aGluZ3MgYmluZCBlYXNpZXIgYW5kIEkgd2lsbCBiZSBhYmxlIHRvIG1ha2UgdGhpbmdzIGVhc2llciBmb3IgTmFOJ3MNCnJlc3BfbnVtIDwtIG5zICU+JSANCiAgZmlsdGVyKGlzLm5hKGBJdGVtIHRleHRgKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDApICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gaWZlbHNlKGBJdGVtIHRleHRgID09ICJOQSIsICIiLCAiIikpICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBhcy5jaGFyYWN0ZXIoYEl0ZW0gdGV4dGApLA0KICAgICAgICAgYEl0ZW0gdGV4dGA9IGlmZWxzZShpcy5uYShgSXRlbSB0ZXh0YCksICIjIG9mIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiKSkgDQoNCnJlc3BfbnVtW10gPC0gbGFwcGx5KHJlc3BfbnVtLCBmdW5jdGlvbih4KSBwYXN0ZSh4LCAicmVzcG9uc2UocykiLCBzZXA9IiAiKSkNCg0KcmVzcF9udW0gPC0gcmVzcF9udW0gJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBpZmVsc2UoYEl0ZW0gdGV4dGAgPT0gIiMgb2YgcmVzcG9uc2UocykgcmVzcG9uc2UocykiLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpDQogIA0KDQojVHVybiBldmVyeXRoaW5nIGludG8gY2hhcmFjdGVyLCBhbmQgcHJlcGFyZSB0byBiaW5kIGJhY2sgaW4gdGhlIHJlc3BvbnNlICMncw0KbnMgPC0gbnMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGBJdGVtIHRleHRgKSkgJT4lICANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGFzLmNoYXJhY3RlcikNCg0KI0JpbmQgdGhlbQ0KbnMgPC0gYmluZF9yb3dzKHJlc3BfbnVtLCBucykNCg0KI1R1cm4gYW55ICJOYW4iJ3MgaW50byAiTm8gcmVzcG9uc2UNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlX2FsbChmdW5zKHN0cl9yZXBsYWNlKC4sICJOYU4iLCAiRGlkIG5vdCBhbnN3ZXIiKSkpDQoNCiNHcmFiIG5hbWVzIGZyb20gKE5hbWVzIGdldCBsb3N0IGluIHRyYW5zcG9zZSkNCnRoaXMgPC0gbmFtZXMobnMpDQoNCiNUcmFuc3Bvc2UgKEZpc3QgY29sdW1uIG5hbWVzIGdldCBsb3N0IGZvciBzb21lIHJlYXNvbiBJIHJlYWxseSBkb24ndCB1bmRlcnN0YW5kIHdoeSBkYXRhLnRhYmxlIGRvZXMgdGhpcy4pDQpucyA8LSBucyAlPiUgDQogIHRyYW5zcG9zZSgpIA0KDQojUmVpbnRyb2R1Y2UgdGhlIHJvd25hbWVzDQpyb3duYW1lcyhucykgPC0gdGhpcw0KDQojVGhlIGZpcnN0IHJvdyBzaG91bGQgYmUgdGhlIGNvbHVtbiBuYW1lcy4gSGVyZSwgSSBhbSBtYWtpbmcgdGhhdCBoYXBwZW4NCmNvbG5hbWVzKG5zKSA8LSBhcy5jaGFyYWN0ZXIodW5saXN0KG5zWzEsXSkpICNQdXQgZmlyc3Qgcm93IGludG8gY29sdW1uIG5hbWVzDQpucyA9IG5zWy0xLCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjRGVsZXRlIGZpcnN0IHJvdw0KDQpucyA8LSBucyAlPiUgDQogIG11dGF0ZShEaXN0cmljdCA9IHJvd25hbWVzKG5zKSkgJT4lIA0KICBzZWxlY3QoRGlzdHJpY3QsIGV2ZXJ5dGhpbmcoKSkNCg0Kc21iMSA8LSBucyAlPiUgDQogIGZpbHRlcihEaXN0cmljdCA9PSAiQXZlcmFnZSIpDQoNCiNNYWtlIGEgbmljZSwgaW50ZXJhY3RpdmUgdGFibGUNCm5zICU+JSANCiBEVDo6ZGF0YXRhYmxlKGVzY2FwZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGF1dG9IaWRlTmF2aWdhdGlvbiA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGZpbGxDb250YWluZXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGNsYXNzID0gInN0cmlwZSByb3ctYm9yZGVyIiwNCiAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBjKCdGaXhlZENvbHVtbnMnLCAnS2V5VGFibGUnKSwNCiAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxZID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZENvbHVtbnMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9IjMwMHB4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzPSAiX2FsbCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IHRleHQtYWxpZ246IGNlbnRlcjsnLCcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sdG9vbHM6OmVtKCcxID0gTm8gaW5wdXQsIDIgPSBMaW1pdGVkIGlucHV0LCAzID0gTW9kZXJhdGUgaW5wdXQsIDQgPSBTdWJzdGFudGlhbCBpbnB1dCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgKSAlPiUgDQogIGZvcm1hdFN0eWxlKG5hbWVzKG5zKSwgYmFja2dyb3VuZENvbG9yID0gc3R5bGVJbnRlcnZhbChjKDAsMSwyLDMsNCksIGNscnMpKSAjJT4lICANCiAgIyAgZm9ybWF0U3R5bGUoJ0l0ZW0gdGV4dCcsIHRhcmdldCA9ICdyb3cnLCANCiAgIyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvciA9IHN0eWxlRXF1YWwobXlfdmFscywgbXlfY29sb3JzKSkNCg0KDQpgYGANCjxicj4NCjxicj4NCg0KIyMjIE90aGVyIHJlc3BvbnNlIGFuc3dlcnMNCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQpzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocm9sZSA9PSAiU2Nob29sIEJvYXJkIE1lbWJlciIpICU+JSANCiAgc2VsZWN0KERpc3RyaWN0ID0gIlRpdGxlIiwgT3RoX3N0YWtfZ29hbHNfVEVYVCkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKE90aF9zdGFrX2dvYWxzX1RFWFQpKSAlPiUgDQogIGFycmFuZ2UoRGlzdHJpY3QpICU+JSANCiAgcmVuYW1lKGBPdGhlciBzdGFrZWhvbGRlcnMgaW5kaWNhdGVkIGZyb20gc3VydmV5YCA9ICJPdGhfc3Rha19nb2Fsc19URVhUIikgJT4lIA0KICBEVDo6ZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1KSwgZXNjYXBlID0gRkFMU0UsIHJvd25hbWVzID0gVFJVRSkNCg0KYGBgDQoNCg0KIyNPcGluaW9ucyBvZiBzY2hvb2wgYm9hcmQgbWVldGluZ3MgeyNzZWM0LjN9DQoNCg0KPGJyPg0KPGJsb2NrcXVvdGU+IDxmb250IHNpemU9IjYiPiAqKlRvIHdoYXQgZXh0ZW50IGRvIHlvdSBhZ3JlZSB3aXRoIG9yIGRpc2FncmVlIHdpdGggdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIHJlZ2FyZGluZyBzY2hvb2wgYm9hcmQgZGlzY3Vzc2lvbnM/Kio8L2ZvbnQ+IDwvYmxvY2txdW90ZT4NCjxicj48YnI+DQoNCmBgYHtyIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT0gRkFMU0UsIGVjaG8gPSBGQUxTRX0NCg0KDQojU3VtbWFyaXplIHRvIGdldCBtZWFuIHZhbHVlcw0KbWVhbnMgPC0gc3VydmV5ICU+JSANCiAgZmlsdGVyKHJvbGUgPT0gIlNjaG9vbCBCb2FyZCBNZW1iZXIiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgYWdyZWVfaG9uZGlzYywgYWdyZWVfcmVzcCwgYWdyZWVfcGFydGljKSAlPiUgDQogIGdyb3VwX2J5KFRpdGxlKSAlPiUgDQogIHN1bW1hcmlzZV9hbGwobWVhbiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICU+JSANCiAgbXV0YXRlX2F0KGMoImFncmVlX2hvbmRpc2MiLCAiYWdyZWVfcmVzcCIsICJhZ3JlZV9wYXJ0aWMiKSAsIGFzLm51bWVyaWMpDQoNCg0Kb3ZlcmFsbF9tZWFuIDwtIG1lYW5zICU+JQ0KICBzdW1tYXJpemUoYWdyZWVfaG9uZGlzYyA9IG1lYW4oYWdyZWVfaG9uZGlzYywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGFncmVlX3Jlc3AgICAgPSBtZWFuKGFncmVlX3Jlc3AgICAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBhZ3JlZV9wYXJ0aWMgID0gbWVhbihhZ3JlZV9wYXJ0aWMgLCBuYS5ybSA9IFRSVUUpDQogICAgICAgICAgICApICU+JSANCiAgbXV0YXRlKFRpdGxlID0gIkF2ZXJhZ2UiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgZXZlcnl0aGluZygpKQ0KDQptZWFucyA8LSAgIGJpbmRfcm93cyhvdmVyYWxsX21lYW4sIG1lYW5zKQ0KDQojRmlsdGVyIHRvIGp1c3QgdmFyaWFibGVzIEkgd2FudA0KbnMgPC0gc3VydmV5ICU+JSANCiAgZmlsdGVyKHJvbGUgPT0gIlNjaG9vbCBCb2FyZCBNZW1iZXIiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgYWdyZWVfaG9uZGlzYywgYWdyZWVfcmVzcCwgYWdyZWVfcGFydGljKSAlPiUgDQogIGdyb3VwX2J5KFRpdGxlKSAlPiUgDQogIHN1bW1hcml6ZShuID0gbigpKQ0KDQojcm91bmQgYWxsIG51bWVyaWMgdmFyaWFibGUgdG8gMiBkZWNpbWFsIHBsYWNlcw0KbnMgPC0gbnMgJT4lIA0KICByaWdodF9qb2luKG1lYW5zLCBieSA9ICJUaXRsZSIpICU+JSANCiAgbXV0YXRlKG4gPSBpZmVsc2UoaXMubmEobiksIHN1bShuLCBuYS5ybSA9IFRSVUUpLCBuKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpIA0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KI0dyYWIgdGhlIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCwgImFncmVlIiBmcm9tIHRoZSB2YXJuYW1lcyBsaXN0LiBJIHdhbnQgdG8gcHJlc2VudCB0aGUgaXRlbSB0ZXh0LCByYXRoZXIgdGhhbiB0aGUgdmFyaWFibGUgbmFtZXMuLi4gd2hpY2ggaXMgcHJlc2VudA0KYWdyZWVfbmFtZXMgPC0gdmFybmFtZXMgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdCh2YXJuYW1lLCAiYWdyZWUiKSA9PSBUUlVFKSAlPiUgDQogIHNlbGVjdCh2YXJuYW1lLCBPcmlnX3Jlc3ApIA0KDQoNCiNOb3cgbWVyZ2UgdGhlIGFncmVlIG5hbWVzIGludG8gdGhlIGRhdHNldA0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZSh2YXJuYW1lID0gcm93Lm5hbWVzKG5zKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWdyZWVfbmFtZXMsIGJ5ID0gInZhcm5hbWUiKSAlPiUgDQogIHNlbGVjdChgSXRlbSB0ZXh0YCA9ICJPcmlnX3Jlc3AiLCBldmVyeXRoaW5nKCksIC12YXJuYW1lKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICNSb3VuZCBldmVyeXRoaW5nIHRvIDIgZGlnaXRzDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICAgICAgICAgICAgICAgICAgICAgICNNYWtlIHN1cmUgb25seSB0d28gZGlnaXRzIGRlc3BsYXkNCg0KDQoNCg0KI1RoaXMgaXMgcmVhbGx5IGFsbCBhc3RoZXRpYy4gSSBkb24ndCB3YW50IHRoZSAjIG9mIHJlc3BvbnNlcyB0byBoYXZlIHR3byBkZWNpbWFsIHBsYWNlcywgc28gSSBuZWVkIHRvIHRha2UgaXQgb3V0LCBtYW5pcHVsYXRlIGl0LCB0aGVuIHB1dCBpdCBiYWNrIGluLiANCiMjQWxzbywgSSBrbm93IGl0J3Mgd2VpcmQsIGJ1dCBJJ20gY29udmVydGluZyB0aGluZ3MgaW50byBjaGFyYWN0ZXIgdmFyaWFibGVzIGZvciBwcmVzZW50YXRpb24uIFRoaXMgbWFrZXMgdGhpbmdzIGJpbmQgZWFzaWVyIGFuZCBJIHdpbGwgYmUgYWJsZSB0byBtYWtlIHRoaW5ncyBlYXNpZXIgZm9yIE5hTidzDQpyZXNwX251bSA8LSBucyAlPiUgDQogIGZpbHRlcihpcy5uYShgSXRlbSB0ZXh0YCkpICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBuc21hbGwgPSAwKSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGlmZWxzZShgSXRlbSB0ZXh0YCA9PSAiTkEiLCAiIiwgIiIpKSAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gYXMuY2hhcmFjdGVyKGBJdGVtIHRleHRgKSwNCiAgICAgICAgIGBJdGVtIHRleHRgPSBpZmVsc2UoaXMubmEoYEl0ZW0gdGV4dGApLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpIA0KDQoNCnJlc3BfbnVtW10gPC0gbGFwcGx5KHJlc3BfbnVtLCBmdW5jdGlvbih4KSBwYXN0ZSh4LCAicmVzcG9uc2UocykiLCBzZXA9IiAiKSkNCg0KcmVzcF9udW0gPC0gcmVzcF9udW0gJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBpZmVsc2UoYEl0ZW0gdGV4dGAgPT0gIiMgb2YgcmVzcG9uc2UocykgcmVzcG9uc2UocykiLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpDQogIA0KDQojVHVybiBldmVyeXRoaW5nIGludG8gY2hhcmFjdGVyLCBhbmQgcHJlcGFyZSB0byBiaW5kIGJhY2sgaW4gdGhlIHJlc3BvbnNlICMncw0KbnMgPC0gbnMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGBJdGVtIHRleHRgKSkgJT4lICANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGFzLmNoYXJhY3RlcikNCg0KI0JpbmQgdGhlbQ0KbnMgPC0gYmluZF9yb3dzKHJlc3BfbnVtLCBucykNCg0KI1R1cm4gYW55ICJOYW4iJ3MgaW50byAiTm8gcmVzcG9uc2UNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlX2FsbChmdW5zKHN0cl9yZXBsYWNlKC4sICJOYU4iLCAiRGlkIG5vdCBhbnN3ZXIiKSkpDQoNCg0KDQoNCg0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGUoRGlzdHJpY3QgPSByb3duYW1lcyhucykpICU+JSANCiAgc2VsZWN0KERpc3RyaWN0LCAgZXZlcnl0aGluZygpKQ0KDQpzbWIyIDwtIG5zICU+JSANCiAgZmlsdGVyKERpc3RyaWN0ID09ICJBdmVyYWdlIikNCg0KI01ha2UgYSBuaWNlLCBpbnRlcmFjdGl2ZSB0YWJsZQ0KbnMgJT4lIA0KIERUOjpkYXRhdGFibGUoZXNjYXBlID0gVFJVRSwgDQogICAgICAgICAgICAgICBhdXRvSGlkZU5hdmlnYXRpb24gPSBGQUxTRSwgDQogICAgICAgICAgICAgICBmaWxsQ29udGFpbmVyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICBjbGFzcyA9ICJzdHJpcGUgcm93LWJvcmRlciIsDQogICAgICAgICAgICAgICBleHRlbnNpb25zID0gYygnRml4ZWRDb2x1bW5zJywgJ0tleVRhYmxlJyksDQogICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxZID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRDb2x1bW5zID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9IjM1MHB4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzPSAiX2FsbCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IHRleHQtYWxpZ246IGNlbnRlcjsnLCcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sdG9vbHM6OmVtKCcxID0gU3Ryb25nbHkgZGlzYWdyZWUsIDIgPSBEaXNhZ3JlZSwgMyA9IEFncmVlLCA0ID0gU3Ryb25nbHkgYWdyZWUnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICkgJT4lIA0KICBmb3JtYXRTdHlsZShuYW1lcyhucyksIGJhY2tncm91bmRDb2xvciA9IHN0eWxlSW50ZXJ2YWwoYygwLDEsMiwzLDQpLCBjbHJzKSkgIyU+JSANCiAgIyAgZm9ybWF0U3R5bGUoJ0l0ZW0gdGV4dCcsIHRhcmdldCA9ICdyb3cnLCANCiAgIyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvciA9IHN0eWxlRXF1YWwobXlfdmFscywgbXlfY29sb3JzKSkNCg0KDQpgYGANCg0KKk5vdGU6IEdyYXkgY2VsbHMgcmVwcmVzZW50IGxvd2VyIGFncmVlYW5jZSB3aXRoIHRoZSBpdGVtcyAoY29sdW1ucykuIFRoZSByZXNwb25zZXMgYXJlIHNlcGFyYXRlZCBieSBkaXN0cmljdCAocm93cykqDQoNCg0KDQojI0VuZ2FnZW1lbnQgaW4gYWN0aXZpdGllcyB7I3NlYzQuNH0NCg0KPGJyPg0KPGJsb2NrcXVvdGU+IDxmb250IHNpemU9IjYiPiAqKkhvdyBvZnRlbiBkb2VzIHlvdXIgc2Nob29sIGJvYXJkIGVuZ2FnZSBpbiB0aGUgZm9sbG93aW5nIG1vbml0b3JpbmcgYWN0aXZpdGllcz8qKjwvZm9udD4gPC9ibG9ja3F1b3RlPg0KPGJyPjxicj4NCg0KYGBge3Igd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KDQoNCiNTdW1tYXJpemUgdG8gZ2V0IG1lYW4gdmFsdWVzDQptZWFucyA8LSBzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocm9sZSA9PSAiU2Nob29sIEJvYXJkIE1lbWJlciIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBzdGFydHNfd2l0aCgiZW5nYWdlIikpICU+JSANCiAgZ3JvdXBfYnkoVGl0bGUpICU+JSANCiAgc3VtbWFyaXNlX2FsbChtZWFuLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMikgJT4lIA0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZW5nYWdlIikpICwgYXMubnVtZXJpYykNCg0KDQpvdmVyYWxsX21lYW4gPC0gbWVhbnMgJT4lDQogIHN1bW1hcml6ZV9hdCh2YXJzKDI6bGVuZ3RoKG1lYW5zKSksIG1lYW4sIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoVGl0bGUgPSAiQXZlcmFnZSIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBldmVyeXRoaW5nKCkpDQoNCm1lYW5zIDwtICAgYmluZF9yb3dzKG92ZXJhbGxfbWVhbiwgbWVhbnMpDQoNCiNGaWx0ZXIgdG8ganVzdCB2YXJpYWJsZXMgSSB3YW50DQpucyA8LSBzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocm9sZSA9PSAiU2Nob29sIEJvYXJkIE1lbWJlciIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBzdGFydHNfd2l0aCgiZW5nYWdlIikpICU+JSANCiAgZ3JvdXBfYnkoVGl0bGUpICU+JSANCiAgc3VtbWFyaXplKG4gPSBuKCkpDQoNCiNyb3VuZCBhbGwgbnVtZXJpYyB2YXJpYWJsZSB0byAyIGRlY2ltYWwgcGxhY2VzDQpucyA8LSBucyAlPiUgDQogIHJpZ2h0X2pvaW4obWVhbnMsIGJ5ID0gIlRpdGxlIikgJT4lIA0KICBtdXRhdGUobiA9IGlmZWxzZShpcy5uYShuKSwgc3VtKG4sIG5hLnJtID0gVFJVRSksIG4pKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikgDQoNCiNHcmFiIG5hbWVzIGZyb20gKE5hbWVzIGdldCBsb3N0IGluIHRyYW5zcG9zZSkNCnRoaXMgPC0gbmFtZXMobnMpDQoNCiNUcmFuc3Bvc2UgKEZpc3QgY29sdW1uIG5hbWVzIGdldCBsb3N0IGZvciBzb21lIHJlYXNvbiBJIHJlYWxseSBkb24ndCB1bmRlcnN0YW5kIHdoeSBkYXRhLnRhYmxlIGRvZXMgdGhpcy4pDQpucyA8LSBucyAlPiUgDQogIHRyYW5zcG9zZSgpIA0KDQojUmVpbnRyb2R1Y2UgdGhlIHJvd25hbWVzDQpyb3duYW1lcyhucykgPC0gdGhpcw0KDQojVGhlIGZpcnN0IHJvdyBzaG91bGQgYmUgdGhlIGNvbHVtbiBuYW1lcy4gSGVyZSwgSSBhbSBtYWtpbmcgdGhhdCBoYXBwZW4NCmNvbG5hbWVzKG5zKSA8LSBhcy5jaGFyYWN0ZXIodW5saXN0KG5zWzEsXSkpICNQdXQgZmlyc3Qgcm93IGludG8gY29sdW1uIG5hbWVzDQpucyA9IG5zWy0xLCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjRGVsZXRlIGZpcnN0IHJvdw0KDQojR3JhYiB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoLCAiYWdyZWUiIGZyb20gdGhlIHZhcm5hbWVzIGxpc3QuIEkgd2FudCB0byBwcmVzZW50IHRoZSBpdGVtIHRleHQsIHJhdGhlciB0aGFuIHRoZSB2YXJpYWJsZSBuYW1lcy4uLiB3aGljaCBpcyBwcmVzZW50DQphZ3JlZV9uYW1lcyA8LSB2YXJuYW1lcyAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhcm5hbWUsICJlbmdhZ2UiKSA9PSBUUlVFKSAlPiUgDQogIHNlbGVjdCh2YXJuYW1lLCBPcmlnX3Jlc3ApIA0KDQoNCiNOb3cgbWVyZ2UgdGhlIGFncmVlIG5hbWVzIGludG8gdGhlIGRhdHNldA0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZSh2YXJuYW1lID0gcm93Lm5hbWVzKG5zKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWdyZWVfbmFtZXMsIGJ5ID0gInZhcm5hbWUiKSAlPiUgDQogIHNlbGVjdChgSXRlbSB0ZXh0YCA9ICJPcmlnX3Jlc3AiLCBldmVyeXRoaW5nKCksIC12YXJuYW1lKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICNSb3VuZCBldmVyeXRoaW5nIHRvIDIgZGlnaXRzDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICAgICAgICAgICAgICAgICAgICAgICNNYWtlIHN1cmUgb25seSB0d28gZGlnaXRzIGRlc3BsYXkNCg0KDQoNCg0KI1RoaXMgaXMgcmVhbGx5IGFsbCBhc3RoZXRpYy4gSSBkb24ndCB3YW50IHRoZSAjIG9mIHJlc3BvbnNlcyB0byBoYXZlIHR3byBkZWNpbWFsIHBsYWNlcywgc28gSSBuZWVkIHRvIHRha2UgaXQgb3V0LCBtYW5pcHVsYXRlIGl0LCB0aGVuIHB1dCBpdCBiYWNrIGluLiANCiMjQWxzbywgSSBrbm93IGl0J3Mgd2VpcmQsIGJ1dCBJJ20gY29udmVydGluZyB0aGluZ3MgaW50byBjaGFyYWN0ZXIgdmFyaWFibGVzIGZvciBwcmVzZW50YXRpb24uIFRoaXMgbWFrZXMgdGhpbmdzIGJpbmQgZWFzaWVyIGFuZCBJIHdpbGwgYmUgYWJsZSB0byBtYWtlIHRoaW5ncyBlYXNpZXIgZm9yIE5hTidzDQpyZXNwX251bSA8LSBucyAlPiUgDQogIGZpbHRlcihpcy5uYShgSXRlbSB0ZXh0YCkpICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBuc21hbGwgPSAwKSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGlmZWxzZShgSXRlbSB0ZXh0YCA9PSAiTkEiLCAiIiwgIiIpKSAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gYXMuY2hhcmFjdGVyKGBJdGVtIHRleHRgKSwNCiAgICAgICAgIGBJdGVtIHRleHRgPSBpZmVsc2UoaXMubmEoYEl0ZW0gdGV4dGApLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpIA0KDQoNCnJlc3BfbnVtW10gPC0gbGFwcGx5KHJlc3BfbnVtLCBmdW5jdGlvbih4KSBwYXN0ZSh4LCAicmVzcG9uc2UocykiLCBzZXA9IiAiKSkNCg0KcmVzcF9udW0gPC0gcmVzcF9udW0gJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBpZmVsc2UoYEl0ZW0gdGV4dGAgPT0gIiMgb2YgcmVzcG9uc2UocykgcmVzcG9uc2UocykiLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpDQogIA0KDQojVHVybiBldmVyeXRoaW5nIGludG8gY2hhcmFjdGVyLCBhbmQgcHJlcGFyZSB0byBiaW5kIGJhY2sgaW4gdGhlIHJlc3BvbnNlICMncw0KbnMgPC0gbnMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGBJdGVtIHRleHRgKSkgJT4lICANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGFzLmNoYXJhY3RlcikNCg0KI0JpbmQgdGhlbQ0KbnMgPC0gYmluZF9yb3dzKHJlc3BfbnVtLCBucykNCg0KI1R1cm4gYW55ICJOYW4iJ3MgaW50byAiTm8gcmVzcG9uc2UNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlX2FsbChmdW5zKHN0cl9yZXBsYWNlKC4sICJOYU4iLCAiRGlkIG5vdCBhbnN3ZXIiKSkpDQoNCg0KDQoNCg0KI0dyYWIgbmFtZXMgZnJvbSAoTmFtZXMgZ2V0IGxvc3QgaW4gdHJhbnNwb3NlKQ0KdGhpcyA8LSBuYW1lcyhucykNCg0KI1RyYW5zcG9zZSAoRmlzdCBjb2x1bW4gbmFtZXMgZ2V0IGxvc3QgZm9yIHNvbWUgcmVhc29uIEkgcmVhbGx5IGRvbid0IHVuZGVyc3RhbmQgd2h5IGRhdGEudGFibGUgZG9lcyB0aGlzLikNCm5zIDwtIG5zICU+JSANCiAgdHJhbnNwb3NlKCkgDQoNCiNSZWludHJvZHVjZSB0aGUgcm93bmFtZXMNCnJvd25hbWVzKG5zKSA8LSB0aGlzDQoNCiNUaGUgZmlyc3Qgcm93IHNob3VsZCBiZSB0aGUgY29sdW1uIG5hbWVzLiBIZXJlLCBJIGFtIG1ha2luZyB0aGF0IGhhcHBlbg0KY29sbmFtZXMobnMpIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QobnNbMSxdKSkgI1B1dCBmaXJzdCByb3cgaW50byBjb2x1bW4gbmFtZXMNCm5zID0gbnNbLTEsIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEZWxldGUgZmlyc3Qgcm93DQoNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlKERpc3RyaWN0ID0gcm93bmFtZXMobnMpKSAlPiUgDQogIHNlbGVjdChEaXN0cmljdCwgZXZlcnl0aGluZygpKQ0KDQpzbWIzIDwtIG5zICU+JSANCiAgZmlsdGVyKERpc3RyaWN0ID09ICJBdmVyYWdlIikNCg0KI01ha2UgYSBuaWNlLCBpbnRlcmFjdGl2ZSB0YWJsZQ0KbnMgJT4lIA0KIERUOjpkYXRhdGFibGUoZXNjYXBlID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgYXV0b0hpZGVOYXZpZ2F0aW9uID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgZmlsbENvbnRhaW5lciA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgY2xhc3MgPSAic3RyaXBlIHJvdy1ib3JkZXIiLA0KICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IGMoJ0ZpeGVkQ29sdW1ucycsICdLZXlUYWJsZScpLA0KICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsWSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkQ29sdW1ucyA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPSIzNTBweCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cz0gIl9hbGwiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyB0ZXh0LWFsaWduOiBjZW50ZXI7JywnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbHRvb2xzOjplbSgnMSA9IE1lZXQgYW5udWFsbHksIDIgPSBCaS1Bbm51YWxseSwgMyA9IFF1YXJ0ZXJseSwgNCA9IG1vbnRobHkgJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICApICU+JSANCiAgZm9ybWF0U3R5bGUobmFtZXMobnMpLCBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUludGVydmFsKGMoMCwxLDIsMyw0KSwgY2xycykpICMlPiUgDQogICMgIGZvcm1hdFN0eWxlKCdJdGVtIHRleHQnLCB0YXJnZXQgPSAncm93JywgDQogICMgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUVxdWFsKG15X3ZhbHMsIG15X2NvbG9ycykpDQoNCg0KYGBgDQoNCg0KIyNPcGluaW9ucyBvZiBMU0cgd29ya3Nob3AgZWZmZWN0aXZlbmVzcyB7I3NlYzQuNX0NCg0KDQo8YnI+DQo8YmxvY2txdW90ZT48Zm9udCBzaXplPSI2Ij4gKipUbyB3aGF0IGV4dGVudCBkbyB5b3UgYWdyZWUgb3IgZGlzYWdyZWUgd2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgYWJvdXQgb3BlcmF0aW5nIHByb2NlZHVyZXMgb2YgdGhlIHNjaG9vbCBib2FyZCBhbmQgc3VwZXJpbnRlbmRlbnQqKjwvZm9udD4gPC9ibG9ja3F1b3RlPg0KPGJyPjxicj4NCg0KYGBge3Igd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KDQoNCiNTdW1tYXJpemUgdG8gZ2V0IG1lYW4gdmFsdWVzDQptZWFucyA8LSBzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocm9sZSA9PSAiU2Nob29sIEJvYXJkIE1lbWJlciIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBzdGFydHNfd2l0aCgicHJvYyIpKSAlPiUgDQogICNyZW5hbWUocHJvY19wcmlvciA9ICJwcm9jX3ByaW9yUiIpDQogIGdyb3VwX2J5KFRpdGxlKSAlPiUgDQogIHN1bW1hcmlzZV9hbGwobWVhbiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInByb2MiKSkgLCBhcy5udW1lcmljKQ0KDQoNCm92ZXJhbGxfbWVhbiA8LSBtZWFucyAlPiUNCiAgc3VtbWFyaXplX2F0KHZhcnMoMjpsZW5ndGgobWVhbnMpKSwgbWVhbiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShUaXRsZSA9ICJBdmVyYWdlIikgJT4lIA0KICBzZWxlY3QoVGl0bGUsIGV2ZXJ5dGhpbmcoKSkNCg0KbWVhbnMgPC0gICBiaW5kX3Jvd3Mob3ZlcmFsbF9tZWFuLCBtZWFucykNCg0KI0ZpbHRlciB0byBqdXN0IHZhcmlhYmxlcyBJIHdhbnQNCm5zIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihyb2xlID09ICJTY2hvb2wgQm9hcmQgTWVtYmVyIikgJT4lIA0KICBzZWxlY3QoVGl0bGUsIHN0YXJ0c193aXRoKCJwcm9jIikpICU+JSANCiAgZ3JvdXBfYnkoVGl0bGUpICU+JSANCiAgc3VtbWFyaXplKG4gPSBuKCkpDQoNCiNyb3VuZCBhbGwgbnVtZXJpYyB2YXJpYWJsZSB0byAyIGRlY2ltYWwgcGxhY2VzDQpucyA8LSBucyAlPiUgDQogIHJpZ2h0X2pvaW4obWVhbnMsIGJ5ID0gIlRpdGxlIikgJT4lIA0KICBtdXRhdGUobiA9IGlmZWxzZShpcy5uYShuKSwgc3VtKG4sIG5hLnJtID0gVFJVRSksIG4pKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikgDQoNCiNHcmFiIG5hbWVzIGZyb20gKE5hbWVzIGdldCBsb3N0IGluIHRyYW5zcG9zZSkNCnRoaXMgPC0gbmFtZXMobnMpDQoNCiNUcmFuc3Bvc2UgKEZpc3QgY29sdW1uIG5hbWVzIGdldCBsb3N0IGZvciBzb21lIHJlYXNvbiBJIHJlYWxseSBkb24ndCB1bmRlcnN0YW5kIHdoeSBkYXRhLnRhYmxlIGRvZXMgdGhpcy4pDQpucyA8LSBucyAlPiUgDQogIHRyYW5zcG9zZSgpIA0KDQojUmVpbnRyb2R1Y2UgdGhlIHJvd25hbWVzDQpyb3duYW1lcyhucykgPC0gdGhpcw0KDQojVGhlIGZpcnN0IHJvdyBzaG91bGQgYmUgdGhlIGNvbHVtbiBuYW1lcy4gSGVyZSwgSSBhbSBtYWtpbmcgdGhhdCBoYXBwZW4NCmNvbG5hbWVzKG5zKSA8LSBhcy5jaGFyYWN0ZXIodW5saXN0KG5zWzEsXSkpICNQdXQgZmlyc3Qgcm93IGludG8gY29sdW1uIG5hbWVzDQpucyA9IG5zWy0xLCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjRGVsZXRlIGZpcnN0IHJvdw0KDQojR3JhYiB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoLCAiYWdyZWUiIGZyb20gdGhlIHZhcm5hbWVzIGxpc3QuIEkgd2FudCB0byBwcmVzZW50IHRoZSBpdGVtIHRleHQsIHJhdGhlciB0aGFuIHRoZSB2YXJpYWJsZSBuYW1lcy4uLiB3aGljaCBpcyBwcmVzZW50DQphZ3JlZV9uYW1lcyA8LSB2YXJuYW1lcyAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhcm5hbWUsICJwcm9jIikgPT0gVFJVRSkgJT4lIA0KICBzZWxlY3QodmFybmFtZSwgT3JpZ19yZXNwKSANCg0KDQojTm93IG1lcmdlIHRoZSBhZ3JlZSBuYW1lcyBpbnRvIHRoZSBkYXRzZXQNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGUodmFybmFtZSA9IHJvdy5uYW1lcyhucykpICU+JSANCiAgbGVmdF9qb2luKGFncmVlX25hbWVzLCBieSA9ICJ2YXJuYW1lIikgJT4lIA0KICBzZWxlY3QoYEl0ZW0gdGV4dGAgPSAiT3JpZ19yZXNwIiwgZXZlcnl0aGluZygpLCAtdmFybmFtZSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICNSb3VuZCBldmVyeXRoaW5nIHRvIDIgZGlnaXRzDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICAgICAgICAgICAgICAgICAgICAgI01ha2Ugc3VyZSBvbmx5IHR3byBkaWdpdHMgZGVzcGxheQ0KDQoNCg0KDQojVGhpcyBpcyByZWFsbHkgYWxsIGFzdGhldGljLiBJIGRvbid0IHdhbnQgdGhlICMgb2YgcmVzcG9uc2VzIHRvIGhhdmUgdHdvIGRlY2ltYWwgcGxhY2VzLCBzbyBJIG5lZWQgdG8gdGFrZSBpdCBvdXQsIG1hbmlwdWxhdGUgaXQsIHRoZW4gcHV0IGl0IGJhY2sgaW4uIA0KIyNBbHNvLCBJIGtub3cgaXQncyB3ZWlyZCwgYnV0IEknbSBjb252ZXJ0aW5nIHRoaW5ncyBpbnRvIGNoYXJhY3RlciB2YXJpYWJsZXMgZm9yIHByZXNlbnRhdGlvbi4gVGhpcyBtYWtlcyB0aGluZ3MgYmluZCBlYXNpZXIgYW5kIEkgd2lsbCBiZSBhYmxlIHRvIG1ha2UgdGhpbmdzIGVhc2llciBmb3IgTmFOJ3MNCnJlc3BfbnVtIDwtIG5zICU+JSANCiAgZmlsdGVyKGlzLm5hKGBJdGVtIHRleHRgKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDApICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gaWZlbHNlKGBJdGVtIHRleHRgID09ICJOQSIsICIiLCAiIikpICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBhcy5jaGFyYWN0ZXIoYEl0ZW0gdGV4dGApLA0KICAgICAgICAgYEl0ZW0gdGV4dGA9IGlmZWxzZShpcy5uYShgSXRlbSB0ZXh0YCksICIjIG9mIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiKSkgDQoNCg0KcmVzcF9udW1bXSA8LSBsYXBwbHkocmVzcF9udW0sIGZ1bmN0aW9uKHgpIHBhc3RlKHgsICJyZXNwb25zZShzKSIsIHNlcD0iICIpKQ0KDQpyZXNwX251bSA8LSByZXNwX251bSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGlmZWxzZShgSXRlbSB0ZXh0YCA9PSAiIyBvZiByZXNwb25zZShzKSByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiKSkNCiAgDQoNCiNUdXJuIGV2ZXJ5dGhpbmcgaW50byBjaGFyYWN0ZXIsIGFuZCBwcmVwYXJlIHRvIGJpbmQgYmFjayBpbiB0aGUgcmVzcG9uc2UgIydzDQpucyA8LSBucyAlPiUgDQogIGZpbHRlcighaXMubmEoYEl0ZW0gdGV4dGApKSAlPiUgIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgYXMuY2hhcmFjdGVyKQ0KDQojQmluZCB0aGVtDQpucyA8LSBiaW5kX3Jvd3MocmVzcF9udW0sIG5zKQ0KDQojVHVybiBhbnkgIk5hbiIncyBpbnRvICJObyByZXNwb25zZQ0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bnMoc3RyX3JlcGxhY2UoLiwgIk5hTiIsICJEaWQgbm90IGFuc3dlciIpKSkNCg0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGUoRGlzdHJpY3QgPSByb3duYW1lcyhucykpICU+JSANCiAgc2VsZWN0KERpc3RyaWN0LCBldmVyeXRoaW5nKCkpDQoNCg0Kc21iNCA8LSBucyAlPiUgDQogIGZpbHRlcihEaXN0cmljdCA9PSAiQXZlcmFnZSIpDQoNCiNNYWtlIGEgbmljZSwgaW50ZXJhY3RpdmUgdGFibGUNCm5zICU+JSANCiBEVDo6ZGF0YXRhYmxlKGVzY2FwZSA9IFRSVUUsIA0KICAgICAgICAgICAgICAgYXV0b0hpZGVOYXZpZ2F0aW9uID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgZmlsbENvbnRhaW5lciA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgY2xhc3MgPSAic3RyaXBlIHJvdy1ib3JkZXIiLA0KICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IGMoJ0ZpeGVkQ29sdW1ucycsICdLZXlUYWJsZScpLA0KICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkQ29sdW1ucyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMzAwcHgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM9ICJfYWxsIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOycsJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWx0b29sczo6ZW0oJzEgPSBTdHJvbmdseSBEaXNhZ3JlZSwgNCA9IFN0cm9uZ2x5IEFncmVlOyBOb3RlOiBJdGVtICJnIiBoYXMgYmVlbiByZXZlcnNlIGNvZGVkICg0ID0gU3Ryb25nbHkgZGlhZ3JlZSwgMSA9IFN0cm9uZ2x5IEFncmVlKScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgKSAlPiUgDQogIGZvcm1hdFN0eWxlKG5hbWVzKG5zKSwgYmFja2dyb3VuZENvbG9yID0gc3R5bGVJbnRlcnZhbChjKDAsMSwyLDMsNCksIGNscnMpKSAjJT4lIA0KICAjICBmb3JtYXRTdHlsZSgnSXRlbSB0ZXh0JywgdGFyZ2V0ID0gJ3JvdycsIA0KICAjICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yID0gc3R5bGVFcXVhbChteV92YWxzLCBteV9jb2xvcnMpKQ0KDQpgYGANCg0KDQoNCiMjT3BpbmlvbiBvZiBMU0cgd29ya3Nob3AgeyNzZWM0LjZ9DQoNCjxicj4NCjxibG9ja3F1b3RlPjxmb250IHNpemU9IjYiPiAqKlRvIHdoYXQgZXh0ZW50IGRvIHlvdSBhZ3JlZSBvciBkaXNhZ3JlZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyByZWdhcmRpbmcgTFNHKio8L2ZvbnQ+IDwvYmxvY2txdW90ZT4NCjxicj48YnI+DQoNCmBgYHtyIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT0gRkFMU0UsIGVjaG8gPSBGQUxTRX0NCg0KDQojU3VtbWFyaXplIHRvIGdldCBtZWFuIHZhbHVlcw0KbWVhbnMgPC0gc3VydmV5ICU+JSANCiAgZmlsdGVyKHJvbGUgPT0gIlNjaG9vbCBCb2FyZCBNZW1iZXIiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgc3RhcnRzX3dpdGgoImFncmVlIiksIC1hZ3JlZV9ob25kaXNjLCAtYWdyZWVfcmVzcCwgLWFncmVlX3BhcnRpYykgJT4lIA0KICBncm91cF9ieShUaXRsZSkgJT4lIA0KICBzdW1tYXJpc2VfYWxsKG1lYW4sIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBuc21hbGwgPSAyKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJhZ3JlZSIpKSAsIGFzLm51bWVyaWMpDQoNCg0Kb3ZlcmFsbF9tZWFuIDwtIG1lYW5zICU+JQ0KICBzdW1tYXJpemVfYXQodmFycygyOmxlbmd0aChtZWFucykpLCBtZWFuLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKFRpdGxlID0gIkF2ZXJhZ2UiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgZXZlcnl0aGluZygpKQ0KDQptZWFucyA8LSAgIGJpbmRfcm93cyhvdmVyYWxsX21lYW4sIG1lYW5zKQ0KDQojRmlsdGVyIHRvIGp1c3QgdmFyaWFibGVzIEkgd2FudA0KbnMgPC0gc3VydmV5ICU+JSANCiAgZmlsdGVyKHJvbGUgPT0gIlNjaG9vbCBCb2FyZCBNZW1iZXIiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgc3RhcnRzX3dpdGgoImFncmVlIiksIC1hZ3JlZV9ob25kaXNjLCAtYWdyZWVfcmVzcCwgLWFncmVlX3BhcnRpYykgJT4lIA0KICBncm91cF9ieShUaXRsZSkgJT4lIA0KICBzdW1tYXJpemUobiA9IG4oKSkNCg0KI3JvdW5kIGFsbCBudW1lcmljIHZhcmlhYmxlIHRvIDIgZGVjaW1hbCBwbGFjZXMNCm5zIDwtIG5zICU+JSANCiAgcmlnaHRfam9pbihtZWFucywgYnkgPSAiVGl0bGUiKSAlPiUgDQogIG11dGF0ZShuID0gaWZlbHNlKGlzLm5hKG4pLCBzdW0obiwgbmEucm0gPSBUUlVFKSwgbikpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKSANCg0KI0dyYWIgbmFtZXMgZnJvbSAoTmFtZXMgZ2V0IGxvc3QgaW4gdHJhbnNwb3NlKQ0KdGhpcyA8LSBuYW1lcyhucykNCg0KI1RyYW5zcG9zZSAoRmlzdCBjb2x1bW4gbmFtZXMgZ2V0IGxvc3QgZm9yIHNvbWUgcmVhc29uIEkgcmVhbGx5IGRvbid0IHVuZGVyc3RhbmQgd2h5IGRhdGEudGFibGUgZG9lcyB0aGlzLikNCm5zIDwtIG5zICU+JSANCiAgdHJhbnNwb3NlKCkgDQoNCiNSZWludHJvZHVjZSB0aGUgcm93bmFtZXMNCnJvd25hbWVzKG5zKSA8LSB0aGlzDQoNCiNUaGUgZmlyc3Qgcm93IHNob3VsZCBiZSB0aGUgY29sdW1uIG5hbWVzLiBIZXJlLCBJIGFtIG1ha2luZyB0aGF0IGhhcHBlbg0KY29sbmFtZXMobnMpIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QobnNbMSxdKSkgI1B1dCBmaXJzdCByb3cgaW50byBjb2x1bW4gbmFtZXMNCm5zID0gbnNbLTEsIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEZWxldGUgZmlyc3Qgcm93DQoNCiNHcmFiIHRoZSBuYW1lcyB0aGF0IHN0YXJ0IHdpdGgsICJhZ3JlZSIgZnJvbSB0aGUgdmFybmFtZXMgbGlzdC4gSSB3YW50IHRvIHByZXNlbnQgdGhlIGl0ZW0gdGV4dCwgcmF0aGVyIHRoYW4gdGhlIHZhcmlhYmxlIG5hbWVzLi4uIHdoaWNoIGlzIHByZXNlbnQNCmFncmVlX25hbWVzIDwtIHZhcm5hbWVzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QodmFybmFtZSwgImFncmVlIikgPT0gVFJVRSAmIHZhcm5hbWUgIT0gImFncmVlX2hvbmRpc2MiICYgdmFybmFtZSAhPSAiYWdyZWVfcmVzcCIgJiB2YXJuYW1lICE9ICJhZ3JlZV9wYXJ0aWMiKSAlPiUgDQogIHNlbGVjdCh2YXJuYW1lLCBPcmlnX3Jlc3ApIA0KDQoNCiNOb3cgbWVyZ2UgdGhlIGFncmVlIG5hbWVzIGludG8gdGhlIGRhdHNldA0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZSh2YXJuYW1lID0gcm93Lm5hbWVzKG5zKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWdyZWVfbmFtZXMsIGJ5ID0gInZhcm5hbWUiKSAlPiUgDQogIHNlbGVjdChgSXRlbSB0ZXh0YCA9ICJPcmlnX3Jlc3AiLCBldmVyeXRoaW5nKCksIC12YXJuYW1lKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgI1JvdW5kIGV2ZXJ5dGhpbmcgdG8gMiBkaWdpdHMNCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMikgICAgICAgICAgICAgICAgICAgICAjTWFrZSBzdXJlIG9ubHkgdHdvIGRpZ2l0cyBkZXNwbGF5DQoNCg0KDQoNCiNUaGlzIGlzIHJlYWxseSBhbGwgYXN0aGV0aWMuIEkgZG9uJ3Qgd2FudCB0aGUgIyBvZiByZXNwb25zZShzKSB0byBoYXZlIHR3byBkZWNpbWFsIHBsYWNlcywgc28gSSBuZWVkIHRvIHRha2UgaXQgb3V0LCBtYW5pcHVsYXRlIGl0LCB0aGVuIHB1dCBpdCBiYWNrIGluLiANCiMjQWxzbywgSSBrbm93IGl0J3Mgd2VpcmQsIGJ1dCBJJ20gY29udmVydGluZyB0aGluZ3MgaW50byBjaGFyYWN0ZXIgdmFyaWFibGVzIGZvciBwcmVzZW50YXRpb24uIFRoaXMgbWFrZXMgdGhpbmdzIGJpbmQgZWFzaWVyIGFuZCBJIHdpbGwgYmUgYWJsZSB0byBtYWtlIHRoaW5ncyBlYXNpZXIgZm9yIE5hTidzDQpyZXNwX251bSA8LSBucyAlPiUgDQogIGZpbHRlcihpcy5uYShgSXRlbSB0ZXh0YCkpICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBuc21hbGwgPSAwKSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGlmZWxzZShgSXRlbSB0ZXh0YCA9PSAiTkEiLCAiIiwgIiIpKSAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gYXMuY2hhcmFjdGVyKGBJdGVtIHRleHRgKSwNCiAgICAgICAgIGBJdGVtIHRleHRgPSBpZmVsc2UoaXMubmEoYEl0ZW0gdGV4dGApLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpIA0KDQoNCnJlc3BfbnVtW10gPC0gbGFwcGx5KHJlc3BfbnVtLCBmdW5jdGlvbih4KSBwYXN0ZSh4LCAicmVzcG9uc2UocykiLCBzZXA9IiAiKSkNCg0KcmVzcF9udW0gPC0gcmVzcF9udW0gJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBpZmVsc2UoYEl0ZW0gdGV4dGAgPT0gIiMgb2YgcmVzcG9uc2UocykgcmVzcG9uc2UocykiLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpDQogIA0KDQojVHVybiBldmVyeXRoaW5nIGludG8gY2hhcmFjdGVyLCBhbmQgcHJlcGFyZSB0byBiaW5kIGJhY2sgaW4gdGhlIHJlc3BvbnNlICMncw0KbnMgPC0gbnMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGBJdGVtIHRleHRgKSkgJT4lICANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGFzLmNoYXJhY3RlcikNCg0KI0JpbmQgdGhlbQ0KbnMgPC0gYmluZF9yb3dzKHJlc3BfbnVtLCBucykNCg0KI1R1cm4gYW55ICJOYW4iJ3MgaW50byAiTm8gcmVzcG9uc2UNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlX2FsbChmdW5zKHN0cl9yZXBsYWNlKC4sICJOYU4iLCAiRGlkIG5vdCBhbnN3ZXIiKSkpDQoNCg0KDQoNCg0KI0dyYWIgbmFtZXMgZnJvbSAoTmFtZXMgZ2V0IGxvc3QgaW4gdHJhbnNwb3NlKQ0KdGhpcyA8LSBuYW1lcyhucykNCg0KI1RyYW5zcG9zZSAoRmlzdCBjb2x1bW4gbmFtZXMgZ2V0IGxvc3QgZm9yIHNvbWUgcmVhc29uIEkgcmVhbGx5IGRvbid0IHVuZGVyc3RhbmQgd2h5IGRhdGEudGFibGUgZG9lcyB0aGlzLikNCm5zIDwtIG5zICU+JSANCiAgdHJhbnNwb3NlKCkgDQoNCiNSZWludHJvZHVjZSB0aGUgcm93bmFtZXMNCnJvd25hbWVzKG5zKSA8LSB0aGlzDQoNCiNUaGUgZmlyc3Qgcm93IHNob3VsZCBiZSB0aGUgY29sdW1uIG5hbWVzLiBIZXJlLCBJIGFtIG1ha2luZyB0aGF0IGhhcHBlbg0KY29sbmFtZXMobnMpIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QobnNbMSxdKSkgI1B1dCBmaXJzdCByb3cgaW50byBjb2x1bW4gbmFtZXMNCm5zID0gbnNbLTEsIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEZWxldGUgZmlyc3Qgcm93DQoNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlKERpc3RyaWN0ID0gcm93bmFtZXMobnMpKSAlPiUgDQogIHNlbGVjdChEaXN0cmljdCwgZXZlcnl0aGluZygpKQ0KDQoNCnNtYjUgPC0gbnMgJT4lIA0KICBmaWx0ZXIoRGlzdHJpY3QgPT0gIkF2ZXJhZ2UiKQ0KDQojTWFrZSBhIG5pY2UsIGludGVyYWN0aXZlIHRhYmxlDQpucyAlPiUgDQogRFQ6OmRhdGF0YWJsZShlc2NhcGUgPSBGQUxTRSwgDQogICAgICAgICAgICAgICBhdXRvSGlkZU5hdmlnYXRpb24gPSBGQUxTRSwgDQogICAgICAgICAgICAgICBmaWxsQ29udGFpbmVyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICBjbGFzcyA9ICJzdHJpcGUgcm93LWJvcmRlciIsDQogICAgICAgICAgICAgICBleHRlbnNpb25zID0gYygnRml4ZWRDb2x1bW5zJywgJ0tleVRhYmxlJyksDQogICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsWSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFggPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRDb2x1bW5zID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPSIzMDBweCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cz0gIl9hbGwiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyB0ZXh0LWFsaWduOiBjZW50ZXI7JywnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbHRvb2xzOjplbSgnMSA9IFN0cm9uZ2x5IERpc2FncmVlLCAyID0gRGlzYWdyZWUsIDMgPSBBZ3JlZSwgNCA9IFN0cm9uZ2x5IEFncmVlJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICApICU+JSANCiAgZm9ybWF0U3R5bGUobmFtZXMobnMpLCBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUludGVydmFsKGMoMCwxLDIsMyw0KSwgY2xycykpICMlPiUgDQogICMgIGZvcm1hdFN0eWxlKCdJdGVtIHRleHQnLCB0YXJnZXQgPSAncm93JywgDQogICMgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUVxdWFsKG15X3ZhbHMsIG15X2NvbG9ycykpDQoNCmBgYA0KDQoNCg0KDQoNCg0KI1N1cGVyaW50ZW5kZW50IHJlc3VsdHMgeyNzZWM1fQ0KYGBge3IsIGVjaG8gPSBGQUxTRSwsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KI1NJIGNvbG9ycw0KY2xycyA8LSByb3VuZChzZXEoMjU1LCAxMCwgbGVuZ3RoLm91dCA9IGxlbmd0aChjKDAsMSwyLDMsNCkgKSsgMSksIDApICU+JQ0Ke3Bhc3RlMCgicmdiKDI1NSwiLCAuLCAiLCIsIC4sICIpIil9DQpgYGANCg0KIyNEZXNjcmlwdGl2ZXMNCiMjI0V4cGVyaWVuY2UgaW4gcm9sZQ0KPGJsb2NrcXVvdGU+PGZvbnQgc2l6ZT0iNiI+ICoqKkluIHRvdGFsLCBob3cgbWFueSB5ZWFycyBoYXZlIHlvdSBzZXJ2ZWQgaW4gdGhpcyByb2xlIGZvciB0aGlzIExFQT8qKiogPC9mb250PjwvYmxvY2txdW90ZT4NCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KQmluX3llYXJzIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihjb25zZW50ID09ICJZZXMsIEkgYWdyZWUgdG8gcGFydGljaXBhdGUuIiwgcm9sZSA9PSAiU3VwZXJpbnRlbmRlbnQiKSAlPiUgDQogIG11dGF0ZShgeWVhcnMgb2YgZXhwYCA9IGlmZWxzZSh5ZWFycyA8IDMsICJMZXNzIHRoYW4gMyB5ZWFycyBleHBlcmllbmNlIiwgTkEpLA0KICAgICAgICAgYHllYXJzIG9mIGV4cGAgPSBpZmVsc2UoeWVhcnMgPiAyICYgeWVhcnMgPCAxMCwgIjMgLSA5IHllYXJzIGV4cGVyaWVuY2UiLCBgeWVhcnMgb2YgZXhwYCksDQogICAgICAgICBgeWVhcnMgb2YgZXhwYCA9IGlmZWxzZSh5ZWFycyA+IDkgJiB5ZWFycyA8IDIxLCAiMTAgLSAyMCB5ZWFycyBleHBlcmllbmNlIiwgYHllYXJzIG9mIGV4cGApLA0KICAgICAgICAgYHllYXJzIG9mIGV4cGAgPSBpZmVsc2UoeWVhcnMgPiAyMCwgIjIxKyB5ZWFycyBleHBlcmllbmNlIiwgYHllYXJzIG9mIGV4cGApLA0KICAgICAgICAgYHllYXJzIG9mIGV4cGAgPSBpZmVsc2UoaXMubmEoeWVhcnMpLCAiTm8gcmVzcG9uc2UiLCBgeWVhcnMgb2YgZXhwYCksDQogICAgICAgICANCiAgICAgICAgIGB5ZWFycyBvZiBleHBgID0gZmFjdG9yKGB5ZWFycyBvZiBleHBgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkxlc3MgdGhhbiAzIHllYXJzIGV4cGVyaWVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMgLSA5IHllYXJzIGV4cGVyaWVuY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAyMCB5ZWFycyBleHBlcmllbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIxKyB5ZWFycyBleHBlcmllbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJlc3BvbnNlIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICApDQoNCnllYXJfc3VtIDwtIEJpbl95ZWFycyAlPiUgDQogIGdyb3VwX2J5KGB5ZWFycyBvZiBleHBgKSAlPiUgDQogIHN1bW1hcml6ZShOID0gbigpKSAlPiUgDQogIGFkZF9yb3coYHllYXJzIG9mIGV4cGAgPSAiMTAgLSAyMCB5ZWFycyBleHBlcmllbmNlIiwgTiA9IDAsIC5iZWZvcmUgPSAzKSAlPiUgDQogIGFkZF9yb3coYHllYXJzIG9mIGV4cGAgPSAiMjErIHllYXJzIGV4cGVyaWVuY2UiLCBOID0gMCwgLmFmdGVyID0gMyApICU+JSANCiAgbXV0YXRlKCBgeWVhcnMgb2YgZXhwYCA9IGZhY3RvcihgeWVhcnMgb2YgZXhwYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJMZXNzIHRoYW4gMyB5ZWFycyBleHBlcmllbmNlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIC0gOSB5ZWFycyBleHBlcmllbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIC0gMjAgeWVhcnMgZXhwZXJpZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMSsgeWVhcnMgZXhwZXJpZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyByZXNwb25zZSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICkNCg0KDQoNCg0KcDEgPC0gZ2dwbG90KGRhdGEgPSB5ZWFyX3N1bSwgYWVzKHggPSBgeWVhcnMgb2YgZXhwYCwgeSA9IE4sIGZpbGwgPSBgeWVhcnMgb2YgZXhwYCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgZ2d0aXRsZSgiUmVzcG9uc2VzIGJ5IHllYXJzIG9mIFN1cGVyaW50ZW5kZW50IGV4cGVyaWVuY2UgKE4gPSAyNCkiLCANCiAgICAgICAgICBzdWJ0aXRsZSA9ICJZZWFycyBvZiBleHBlcmllbmNlIGNhdGVnb3JpZXMgZGVyaXZlZCBmcm9tIERlcHQuIG9mIEVkdWNhdGlvbiBjYXRlZ29yaWVzIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgcmVzcG9uc2VzIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxNSwgNSksIGV4cGFuZCA9IGV4cGFuZF9zY2FsZShtdWx0ID0gYygwLCAuMSkpKSArDQogIHRoZW1lX2xpZ2h0KCkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpIywgDQogICAgICAgICNwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgI3BhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSAjLA0KICAgICAgICAjIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkNCiAgICAgICAgKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKCJZZWFycyBvZiBleHBlcmllbmNlIiwgdmFsdWVzID0gYygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVzcyB0aGFuIDMgeWVhcnMgZXhwZXJpZW5jZSIgPSAiI2ZmMDAwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIC0gOSB5ZWFycyBleHBlcmllbmNlIiAgICAgICA9ICIjYmYwMDAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIC0gMjAgeWVhcnMgZXhwZXJpZW5jZSIgICAgID0gIiM4MDAwMDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjErIHllYXJzIGV4cGVyaWVuY2UiICAgICAgICAgPSAiIzQwMDAwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyByZXNwb25zZSIgICAgICAgICAgICAgICAgICA9ICJncmV5Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgKSANCg0KZ2dwbG90bHkocDEpDQoNCmBgYA0KDQojIyNTY2hvb2wgYm9hcmQgbWVldGluZ3MgYXR0ZW5kZWQgeyNzZWM1LjF9DQo8YmxvY2txdW90ZT48Zm9udCBzaXplPSI2Ij4gKioqSG93IG1hbnkgc2Nob29sIGJvYXJkIG1lZXRpbmdzIGhhdmUgeW91IGF0dGVuZGVkIGR1cmluZyB0aGUgMjAxOC0xOSBzY2hvb2wgeWVhciAoaW5jbHVkaW5nIG9ubHkgZnVsbCBzY2hvb2wgYm9hcmQgbWVldGluZ3MgdGhhdCBhcmUgb3BlbiB0byB0aGUgcHVibGljKT8qKiogPC9mb250PjwvYmxvY2txdW90ZT4NCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbWVldF9zdW0gPC0gc3VydmV5ICU+JSANCiAgZmlsdGVyKGNvbnNlbnQgPT0gIlllcywgSSBhZ3JlZSB0byBwYXJ0aWNpcGF0ZS4iLCByb2xlID09ICJTdXBlcmludGVuZGVudCIpICU+JSANCiAgZ3JvdXBfYnkoYmluX2JvYXJkX21lZXRzKSAlPiUgDQogIHN1bW1hcml6ZShOID0gbigpKSAlPiUgDQogIHJlbmFtZShgIyBvZiBUaW1lcyBhdHRlbmRlZCBib2FyZCBtZWV0aW5nYCA9ICJiaW5fYm9hcmRfbWVldHMiKSAlPiUgDQogIGFkZF9yb3coYCMgb2YgVGltZXMgYXR0ZW5kZWQgYm9hcmQgbWVldGluZ2AgPSAiTGVzcyB0aGFuIDggdGltZXMiLCBOID0gMCkNCg0KDQoNCg0KcDEgPC0gZ2dwbG90KGRhdGEgPSBtZWV0X3N1bSwgYWVzKHggPSBgIyBvZiBUaW1lcyBhdHRlbmRlZCBib2FyZCBtZWV0aW5nYCwgeSA9IE4sIGZpbGwgPSBgIyBvZiBUaW1lcyBhdHRlbmRlZCBib2FyZCBtZWV0aW5nYCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgZ2d0aXRsZSgiUmVzcG9uc2VzIGJ5ICMgb2YgdGltZXMgYXR0ZW5kZWQgYSBzY2hvb2wgYm9hcmQgbWVldGluZyAoTiA9IDI0KSIpKw0KICB5bGFiKCJOdW1iZXIgb2YgcmVzcG9uc2VzIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAyNSwgNSksIGV4cGFuZCA9IGV4cGFuZF9zY2FsZShtdWx0ID0gYygwLCAuMSkpKSArDQogIHRoZW1lX2xpZ2h0KCkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpIywgDQogICAgICAgICNwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgI3BhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSAjLA0KICAgICAgICAjIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkNCiAgICAgICAgKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKCJNZWV0aW5ncyBhdHRlbmRlZCIsIHZhbHVlcyA9IGMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlc3MgdGhhbiA4IHRpbWVzIiA9ICIjZmYwMDAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjggLSAxMSB0aW1lcyIgICAgICA9ICIjYmYwMDAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEyIG9yIG1vcmUgdGltZXMiICA9ICIjODAwMDAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHJlc3BvbnNlIiAgICAgICA9ICJncmV5Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICkgDQoNCg0KICANCg0KZ2dwbG90bHkocDEpDQpgYGANCg0KDQojI0V4dGVudCB0byB3aGljaCBzdGFrZWhvbGRlcnMgcHJvdmlkZSBpbnB1dCB7I3NlYzUuMn0NCjxicj4NCjxibG9ja3F1b3RlPjxmb250IHNpemU9IjYiPiAqKipJbiAyMDE4LTE5LCB0byB3aGF0IGV4dGVudCBoYXZlIHRoZSBmb2xsb3dpbmcgZ3JvdXBzIG9mIHN0YWtlaG9sZGVycyBwcm92aWRlZCBpbnB1dCB0byB0aGUgc2Nob29sIGJvYXJkIHJlZ2FyZGluZyBkZXZlbG9wbWVudCBvZiBnb2FscyBvciB2aXNpb24/KioqPC9mb250PiA8L2Jsb2NrcXVvdGU+DQo8YnI+PGJyPg0KDQpgYGB7ciB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQoNCg0KI1N1bW1hcml6ZSB0byBnZXQgbWVhbiB2YWx1ZXMNCm1lYW5zIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihyb2xlID09ICJTdXBlcmludGVuZGVudCIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBzdGFydHNfd2l0aCgic3RhayIpKSAlPiUgDQogIGdyb3VwX2J5KFRpdGxlKSAlPiUgDQogIHN1bW1hcmlzZV9hbGwobWVhbiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInN0YWsiKSkgLCBhcy5udW1lcmljKQ0KDQoNCm92ZXJhbGxfbWVhbiA8LSBtZWFucyAlPiUNCiAgc3VtbWFyaXplX2F0KHZhcnMoMjpsZW5ndGgobWVhbnMpKSwgbWVhbiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShUaXRsZSA9ICJBdmVyYWdlIikgJT4lIA0KICBzZWxlY3QoVGl0bGUsIGV2ZXJ5dGhpbmcoKSkNCg0KbWVhbnMgPC0gICBiaW5kX3Jvd3Mob3ZlcmFsbF9tZWFuLCBtZWFucykNCg0KI0ZpbHRlciB0byBqdXN0IHZhcmlhYmxlcyBJIHdhbnQNCm5zIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihyb2xlID09ICJTdXBlcmludGVuZGVudCIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBzdGFydHNfd2l0aCgic3RhayIpKSAlPiUgDQogIGdyb3VwX2J5KFRpdGxlKSAlPiUgDQogIHN1bW1hcml6ZShuID0gbigpKQ0KDQojcm91bmQgYWxsIG51bWVyaWMgdmFyaWFibGUgdG8gMiBkZWNpbWFsIHBsYWNlcw0KbnMgPC0gbnMgJT4lIA0KICByaWdodF9qb2luKG1lYW5zLCBieSA9ICJUaXRsZSIpICU+JSANCiAgbXV0YXRlKG4gPSBpZmVsc2UoaXMubmEobiksIHN1bShuLCBuYS5ybSA9IFRSVUUpLCBuKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpIA0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KI0dyYWIgdGhlIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCwgInN0YWsiIGZyb20gdGhlIHZhcm5hbWVzIGxpc3QuIEkgd2FudCB0byBwcmVzZW50IHRoZSBpdGVtIHRleHQsIHJhdGhlciB0aGFuIHRoZSB2YXJpYWJsZSBuYW1lcy4uLiB3aGljaCBpcyBwcmVzZW50DQphZ3JlZV9uYW1lcyA8LSB2YXJuYW1lcyAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhcm5hbWUsICJzdGFrIikgPT0gVFJVRSkgJT4lIA0KICBzZWxlY3QodmFybmFtZSwgT3JpZ19yZXNwKSANCg0KDQojTm93IG1lcmdlIHRoZSBhZ3JlZSBuYW1lcyBpbnRvIHRoZSBkYXRzZXQNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGUodmFybmFtZSA9IHJvdy5uYW1lcyhucykpICU+JSANCiAgbGVmdF9qb2luKGFncmVlX25hbWVzLCBieSA9ICJ2YXJuYW1lIikgJT4lIA0KICBzZWxlY3QoYEl0ZW0gdGV4dGAgPSAiT3JpZ19yZXNwIiwgZXZlcnl0aGluZygpLCAtdmFybmFtZSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpICU+JSAjUm91bmQgZXZlcnl0aGluZyB0byAyIGRpZ2l0cw0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBuc21hbGwgPSAyKSAjTWFrZSBzdXJlIG9ubHkgdHdvIGRpZ2l0cyBkZXNwbGF5DQoNCiNUaGlzIGlzIHJlYWxseSBhbGwgYXN0aGV0aWMuIEkgZG9uJ3Qgd2FudCB0aGUgIyBvZiByZXNwb25zZXMgdG8gaGF2ZSB0d28gZGVjaW1hbCBwbGFjZXMsIHNvIEkgbmVlZCB0byB0YWtlIGl0IG91dCwgbWFuaXB1bGF0ZSBpdCwgdGhlbiBwdXQgaXQgYmFjayBpbi4gDQojI0Fsc28sIEkga25vdyBpdCdzIHdlaXJkLCBidXQgSSdtIGNvbnZlcnRpbmcgdGhpbmdzIGludG8gY2hhcmFjdGVyIHZhcmlhYmxlcyBmb3IgcHJlc2VudGF0aW9uLiBUaGlzIG1ha2VzIHRoaW5ncyBiaW5kIGVhc2llciBhbmQgSSB3aWxsIGJlIGFibGUgdG8gbWFrZSB0aGluZ3MgZWFzaWVyIGZvciBOYU4ncw0KcmVzcF9udW0gPC0gbnMgJT4lIA0KICBmaWx0ZXIoaXMubmEoYEl0ZW0gdGV4dGApKSAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMCkgJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBpZmVsc2UoYEl0ZW0gdGV4dGAgPT0gIk5BIiwgIiIsICIiKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGFzLmNoYXJhY3RlcihgSXRlbSB0ZXh0YCksDQogICAgICAgICBgSXRlbSB0ZXh0YD0gaWZlbHNlKGlzLm5hKGBJdGVtIHRleHRgKSwgIiMgb2YgcmVzcG9uc2UocykiLCAiIyBvZiByZXNwb25zZShzKSIpKSANCg0KcmVzcF9udW1bXSA8LSBsYXBwbHkocmVzcF9udW0sIGZ1bmN0aW9uKHgpIHBhc3RlKHgsICJyZXNwb25zZShzKSIsIHNlcD0iICIpKQ0KDQpyZXNwX251bSA8LSByZXNwX251bSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGlmZWxzZShgSXRlbSB0ZXh0YCA9PSAiIyBvZiByZXNwb25zZShzKSByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiKSkNCiAgDQoNCiNUdXJuIGV2ZXJ5dGhpbmcgaW50byBjaGFyYWN0ZXIsIGFuZCBwcmVwYXJlIHRvIGJpbmQgYmFjayBpbiB0aGUgcmVzcG9uc2UgIydzDQpucyA8LSBucyAlPiUgDQogIGZpbHRlcighaXMubmEoYEl0ZW0gdGV4dGApKSAlPiUgIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgYXMuY2hhcmFjdGVyKQ0KDQojQmluZCB0aGVtDQpucyA8LSBiaW5kX3Jvd3MocmVzcF9udW0sIG5zKQ0KDQojVHVybiBhbnkgIk5hbiIncyBpbnRvICJObyByZXNwb25zZQ0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bnMoc3RyX3JlcGxhY2UoLiwgIk5hTiIsICJEaWQgbm90IGFuc3dlciIpKSkNCg0KDQoNCg0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGUoRGlzdHJpY3QgPSByb3duYW1lcyhucykpICU+JSANCiAgc2VsZWN0KERpc3RyaWN0LCBldmVyeXRoaW5nKCkpDQoNCnNpMSA8LSBucyAlPiUgDQogIGZpbHRlcihEaXN0cmljdCA9PSAiQXZlcmFnZSIpDQoNCiNNYWtlIGEgbmljZSwgaW50ZXJhY3RpdmUgdGFibGUNCm5zICU+JSANCiBEVDo6ZGF0YXRhYmxlKGVzY2FwZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGF1dG9IaWRlTmF2aWdhdGlvbiA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGZpbGxDb250YWluZXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGNsYXNzID0gInN0cmlwZSByb3ctYm9yZGVyIiwNCiAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBjKCdGaXhlZENvbHVtbnMnLCAnS2V5VGFibGUnKSwNCiAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxZID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZENvbHVtbnMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9IjMwMHB4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzPSAiX2FsbCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IHRleHQtYWxpZ246IGNlbnRlcjsnLCcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sdG9vbHM6OmVtKCcxID0gTm8gaW5wdXQsIDI9IExpbWl0ZWQgaW5wdXQsIDMgPSBNb2RlcmF0ZSBpbnB1dCwgNCA9IFN1YnN0YW50aWFsIGlucHV0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICApICU+JSANCiAgZm9ybWF0U3R5bGUobmFtZXMobnMpLCBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUludGVydmFsKGMoMCwxLDIsMyw0KSwgY2xycykpICMlPiUgDQogICMgIGZvcm1hdFN0eWxlKCdJdGVtIHRleHQnLCB0YXJnZXQgPSAncm93JywgDQogICMgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUVxdWFsKG15X3ZhbHMsIG15X2NvbG9ycykpDQoNCg0KYGBgDQo8YnI+DQo8YnI+DQoNCiMjIyBPdGhlciByZXNwb25zZSBhbnN3ZXJzDQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCg0Kc3VydmV5ICU+JSANCiAgZmlsdGVyKHJvbGUgPT0gIlN1cGVyaW50ZW5kZW50IikgJT4lIA0KICBzZWxlY3QoRGlzdHJpY3QgPSAiVGl0bGUiLCBPdGhfc3Rha19nb2Fsc19URVhUKSAlPiUgDQogIGZpbHRlcighaXMubmEoT3RoX3N0YWtfZ29hbHNfVEVYVCkpICU+JSANCiAgYXJyYW5nZShEaXN0cmljdCkgJT4lIA0KICByZW5hbWUoYE90aGVyIHN0YWtlaG9sZGVycyBpbmRpY2F0ZWQgZnJvbSBzdXJ2ZXlgID0gIk90aF9zdGFrX2dvYWxzX1RFWFQiKSAlPiUgDQogIERUOjpkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUpLCBlc2NhcGUgPSBGQUxTRSwgcm93bmFtZXMgPSBUUlVFKQ0KDQpgYGANCg0KDQojI09waW5pb25zIG9mIHNjaG9vbCBib2FyZCBtZWV0aW5ncyB7I3NlYzUuM30NCg0KDQo8YnI+DQo8YmxvY2txdW90ZT48Zm9udCBzaXplPSI2Ij4gKipUbyB3aGF0IGV4dGVudCBkbyB5b3UgYWdyZWUgd2l0aCBvciBkaXNhZ3JlZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyByZWdhcmRpbmcgc2Nob29sIGJvYXJkIGRpc2N1c3Npb25zPyoqPC9mb250PiA8L2Jsb2NrcXVvdGU+DQo8YnI+PGJyPg0KDQpgYGB7ciB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQoNCg0KI1N1bW1hcml6ZSB0byBnZXQgbWVhbiB2YWx1ZXMNCm1lYW5zIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihyb2xlID09ICJTdXBlcmludGVuZGVudCIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBhZ3JlZV9ob25kaXNjLCBhZ3JlZV9yZXNwLCBhZ3JlZV9wYXJ0aWMpICU+JSANCiAgZ3JvdXBfYnkoVGl0bGUpICU+JSANCiAgc3VtbWFyaXNlX2FsbChtZWFuLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMikgJT4lIA0KICBtdXRhdGVfYXQoYygiYWdyZWVfaG9uZGlzYyIsICJhZ3JlZV9yZXNwIiwgImFncmVlX3BhcnRpYyIpICwgYXMubnVtZXJpYykNCg0KDQpvdmVyYWxsX21lYW4gPC0gbWVhbnMgJT4lDQogIHN1bW1hcml6ZShhZ3JlZV9ob25kaXNjID0gbWVhbihhZ3JlZV9ob25kaXNjLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgYWdyZWVfcmVzcCAgID0gbWVhbihhZ3JlZV9yZXNwICAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBhZ3JlZV9wYXJ0aWMgPSBtZWFuKGFncmVlX3BhcnRpYywgbmEucm0gPSBUUlVFKQ0KICAgICAgICAgICAgKSAlPiUgDQogIG11dGF0ZShUaXRsZSA9ICJBdmVyYWdlIikgJT4lIA0KICBzZWxlY3QoVGl0bGUsIGV2ZXJ5dGhpbmcoKSkNCg0KbWVhbnMgPC0gICBiaW5kX3Jvd3Mob3ZlcmFsbF9tZWFuLCBtZWFucykNCg0KI0ZpbHRlciB0byBqdXN0IHZhcmlhYmxlcyBJIHdhbnQNCm5zIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihyb2xlID09ICJTdXBlcmludGVuZGVudCIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBhZ3JlZV9ob25kaXNjLCBhZ3JlZV9yZXNwLCBhZ3JlZV9wYXJ0aWMpICU+JSANCiAgZ3JvdXBfYnkoVGl0bGUpICU+JSANCiAgc3VtbWFyaXplKG4gPSBuKCkpDQoNCiNyb3VuZCBhbGwgbnVtZXJpYyB2YXJpYWJsZSB0byAyIGRlY2ltYWwgcGxhY2VzDQpucyA8LSBucyAlPiUgDQogIHJpZ2h0X2pvaW4obWVhbnMsIGJ5ID0gIlRpdGxlIikgJT4lIA0KICBtdXRhdGUobiA9IGlmZWxzZShpcy5uYShuKSwgc3VtKG4sIG5hLnJtID0gVFJVRSksIG4pKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikgDQoNCiNHcmFiIG5hbWVzIGZyb20gKE5hbWVzIGdldCBsb3N0IGluIHRyYW5zcG9zZSkNCnRoaXMgPC0gbmFtZXMobnMpDQoNCiNUcmFuc3Bvc2UgKEZpc3QgY29sdW1uIG5hbWVzIGdldCBsb3N0IGZvciBzb21lIHJlYXNvbiBJIHJlYWxseSBkb24ndCB1bmRlcnN0YW5kIHdoeSBkYXRhLnRhYmxlIGRvZXMgdGhpcy4pDQpucyA8LSBucyAlPiUgDQogIHRyYW5zcG9zZSgpIA0KDQojUmVpbnRyb2R1Y2UgdGhlIHJvd25hbWVzDQpyb3duYW1lcyhucykgPC0gdGhpcw0KDQojVGhlIGZpcnN0IHJvdyBzaG91bGQgYmUgdGhlIGNvbHVtbiBuYW1lcy4gSGVyZSwgSSBhbSBtYWtpbmcgdGhhdCBoYXBwZW4NCmNvbG5hbWVzKG5zKSA8LSBhcy5jaGFyYWN0ZXIodW5saXN0KG5zWzEsXSkpICNQdXQgZmlyc3Qgcm93IGludG8gY29sdW1uIG5hbWVzDQpucyA9IG5zWy0xLCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjRGVsZXRlIGZpcnN0IHJvdw0KDQojR3JhYiB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoLCAiYWdyZWUiIGZyb20gdGhlIHZhcm5hbWVzIGxpc3QuIEkgd2FudCB0byBwcmVzZW50IHRoZSBpdGVtIHRleHQsIHJhdGhlciB0aGFuIHRoZSB2YXJpYWJsZSBuYW1lcy4uLiB3aGljaCBpcyBwcmVzZW50DQphZ3JlZV9uYW1lcyA8LSB2YXJuYW1lcyAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhcm5hbWUsICJhZ3JlZSIpID09IFRSVUUpICU+JSANCiAgc2VsZWN0KHZhcm5hbWUsIE9yaWdfcmVzcCkgDQoNCg0KI05vdyBtZXJnZSB0aGUgYWdyZWUgbmFtZXMgaW50byB0aGUgZGF0c2V0DQpucyA8LSBucyAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSANCiAgbXV0YXRlKHZhcm5hbWUgPSByb3cubmFtZXMobnMpKSAlPiUgDQogIGxlZnRfam9pbihhZ3JlZV9uYW1lcywgYnkgPSAidmFybmFtZSIpICU+JSANCiAgc2VsZWN0KGBJdGVtIHRleHRgID0gIk9yaWdfcmVzcCIsIGV2ZXJ5dGhpbmcoKSwgLXZhcm5hbWUpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKSAlPiUgI1JvdW5kIGV2ZXJ5dGhpbmcgdG8gMiBkaWdpdHMNCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMikgICNNYWtlIHN1cmUgb25seSB0d28gZGlnaXRzIGRlc3BsYXkNCg0KDQoNCg0KI1RoaXMgaXMgcmVhbGx5IGFsbCBhc3RoZXRpYy4gSSBkb24ndCB3YW50IHRoZSAjIG9mIHJlc3BvbnNlKHMpIHRvIGhhdmUgdHdvIGRlY2ltYWwgcGxhY2VzLCBzbyBJIG5lZWQgdG8gdGFrZSBpdCBvdXQsIG1hbmlwdWxhdGUgaXQsIHRoZW4gcHV0IGl0IGJhY2sgaW4uIA0KIyNBbHNvLCBJIGtub3cgaXQncyB3ZWlyZCwgYnV0IEknbSBjb252ZXJ0aW5nIHRoaW5ncyBpbnRvIGNoYXJhY3RlciB2YXJpYWJsZXMgZm9yIHByZXNlbnRhdGlvbi4gVGhpcyBtYWtlcyB0aGluZ3MgYmluZCBlYXNpZXIgYW5kIEkgd2lsbCBiZSBhYmxlIHRvIG1ha2UgdGhpbmdzIGVhc2llciBmb3IgTmFOJ3MNCnJlc3BfbnVtIDwtIG5zICU+JSANCiAgZmlsdGVyKGlzLm5hKGBJdGVtIHRleHRgKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDApICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gaWZlbHNlKGBJdGVtIHRleHRgID09ICJOQSIsICIiLCAiIikpICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBhcy5jaGFyYWN0ZXIoYEl0ZW0gdGV4dGApLA0KICAgICAgICAgYEl0ZW0gdGV4dGA9IGlmZWxzZShpcy5uYShgSXRlbSB0ZXh0YCksICIjIG9mIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiKSkgDQoNCg0KcmVzcF9udW1bXSA8LSBsYXBwbHkocmVzcF9udW0sIGZ1bmN0aW9uKHgpIHBhc3RlKHgsICJyZXNwb25zZShzKSIsIHNlcD0iICIpKQ0KDQpyZXNwX251bSA8LSByZXNwX251bSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGlmZWxzZShgSXRlbSB0ZXh0YCA9PSAiIyBvZiByZXNwb25zZShzKSByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiKSkNCiAgDQoNCiNUdXJuIGV2ZXJ5dGhpbmcgaW50byBjaGFyYWN0ZXIsIGFuZCBwcmVwYXJlIHRvIGJpbmQgYmFjayBpbiB0aGUgcmVzcG9uc2UgIydzDQpucyA8LSBucyAlPiUgDQogIGZpbHRlcighaXMubmEoYEl0ZW0gdGV4dGApKSAlPiUgIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgYXMuY2hhcmFjdGVyKQ0KDQojQmluZCB0aGVtDQpucyA8LSBiaW5kX3Jvd3MocmVzcF9udW0sIG5zKQ0KDQojVHVybiBhbnkgIk5hbiIncyBpbnRvICJObyByZXNwb25zZQ0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bnMoc3RyX3JlcGxhY2UoLiwgIk5hTiIsICJEaWQgbm90IGFuc3dlciIpKSkNCg0KDQoNCg0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGUoRGlzdHJpY3QgPSByb3duYW1lcyhucykpICU+JSANCiAgc2VsZWN0KERpc3RyaWN0LCBldmVyeXRoaW5nKCkpDQoNCnNpMiA8LSBucyAlPiUgDQogIGZpbHRlcihEaXN0cmljdCA9PSAiQXZlcmFnZSIpDQoNCiNNYWtlIGEgbmljZSwgaW50ZXJhY3RpdmUgdGFibGUNCm5zICU+JSANCiBEVDo6ZGF0YXRhYmxlKGVzY2FwZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGF1dG9IaWRlTmF2aWdhdGlvbiA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGZpbGxDb250YWluZXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGNsYXNzID0gInN0cmlwZSByb3ctYm9yZGVyIiwNCiAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBjKCdGaXhlZENvbHVtbnMnLCAnS2V5VGFibGUnKSwNCiAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZENvbHVtbnMgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMzUwcHgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM9ICJfYWxsIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOycsJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWx0b29sczo6ZW0oJzEgPSBTdHJvbmdseSBkaXNhZ3JlZSwgMiA9IERpc2FncmVlLCAzID0gQWdyZWUsIDQgPSBTdHJvbmdseSBhZ3JlZScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgKSAlPiUgDQogIGZvcm1hdFN0eWxlKG5hbWVzKG5zKSwgYmFja2dyb3VuZENvbG9yID0gc3R5bGVJbnRlcnZhbChjKDAsMSwyLDMsNCksIGNscnMpKSAjJT4lIA0KICAjICBmb3JtYXRTdHlsZSgnSXRlbSB0ZXh0JywgdGFyZ2V0ID0gJ3JvdycsIA0KICAjICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yID0gc3R5bGVFcXVhbChteV92YWxzLCBteV9jb2xvcnMpKQ0KDQoNCmBgYA0KDQoNCg0KDQojI0VuZ2FnZW1lbnQgaW4gYWN0aXZpdGllcyB7I3NlYzUuNH0NCg0KPGJyPg0KPGJsb2NrcXVvdGU+PGZvbnQgc2l6ZT0iNiI+ICoqSG93IG9mdGVuIGRvZXMgeW91ciBzY2hvb2wgYm9hcmQgZW5nYWdlIGluIHRoZSBmb2xsb3dpbmcgbW9uaXRvcmluZyBhY3Rpdml0aWVzPyoqPC9mb250PiA8L2Jsb2NrcXVvdGU+DQo8YnI+PGJyPg0KDQpgYGB7ciB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQoNCg0KI1N1bW1hcml6ZSB0byBnZXQgbWVhbiB2YWx1ZXMNCm1lYW5zIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihyb2xlID09ICJTdXBlcmludGVuZGVudCIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBzdGFydHNfd2l0aCgiZW5nYWdlIikpICU+JSANCiAgZ3JvdXBfYnkoVGl0bGUpICU+JSANCiAgc3VtbWFyaXNlX2FsbChtZWFuLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMikgJT4lIA0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZW5nYWdlIikpICwgYXMubnVtZXJpYykNCg0KDQpvdmVyYWxsX21lYW4gPC0gbWVhbnMgJT4lDQogIHN1bW1hcml6ZV9hdCh2YXJzKDI6bGVuZ3RoKG1lYW5zKSksIG1lYW4sIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoVGl0bGUgPSAiQXZlcmFnZSIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBldmVyeXRoaW5nKCkpDQoNCm1lYW5zIDwtICAgYmluZF9yb3dzKG92ZXJhbGxfbWVhbiwgbWVhbnMpDQoNCiNGaWx0ZXIgdG8ganVzdCB2YXJpYWJsZXMgSSB3YW50DQpucyA8LSBzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocm9sZSA9PSAiU3VwZXJpbnRlbmRlbnQiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgc3RhcnRzX3dpdGgoImVuZ2FnZSIpKSAlPiUgDQogIGdyb3VwX2J5KFRpdGxlKSAlPiUgDQogIHN1bW1hcml6ZShuID0gbigpKQ0KDQojcm91bmQgYWxsIG51bWVyaWMgdmFyaWFibGUgdG8gMiBkZWNpbWFsIHBsYWNlcw0KbnMgPC0gbnMgJT4lIA0KICByaWdodF9qb2luKG1lYW5zLCBieSA9ICJUaXRsZSIpICU+JSANCiAgbXV0YXRlKG4gPSBpZmVsc2UoaXMubmEobiksIHN1bShuLCBuYS5ybSA9IFRSVUUpLCBuKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpIA0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KI0dyYWIgdGhlIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCwgImFncmVlIiBmcm9tIHRoZSB2YXJuYW1lcyBsaXN0LiBJIHdhbnQgdG8gcHJlc2VudCB0aGUgaXRlbSB0ZXh0LCByYXRoZXIgdGhhbiB0aGUgdmFyaWFibGUgbmFtZXMuLi4gd2hpY2ggaXMgcHJlc2VudA0KYWdyZWVfbmFtZXMgPC0gdmFybmFtZXMgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdCh2YXJuYW1lLCAiZW5nYWdlIikgPT0gVFJVRSkgJT4lIA0KICBzZWxlY3QodmFybmFtZSwgT3JpZ19yZXNwKSANCg0KDQojTm93IG1lcmdlIHRoZSBhZ3JlZSBuYW1lcyBpbnRvIHRoZSBkYXRzZXQNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGUodmFybmFtZSA9IHJvdy5uYW1lcyhucykpICU+JSANCiAgbGVmdF9qb2luKGFncmVlX25hbWVzLCBieSA9ICJ2YXJuYW1lIikgJT4lIA0KICBzZWxlY3QoYEl0ZW0gdGV4dGAgPSAiT3JpZ19yZXNwIiwgZXZlcnl0aGluZygpLCAtdmFybmFtZSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpICU+JSAjUm91bmQgZXZlcnl0aGluZyB0byAyIGRpZ2l0cw0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBuc21hbGwgPSAyKSAgI01ha2Ugc3VyZSBvbmx5IHR3byBkaWdpdHMgZGVzcGxheQ0KDQoNCg0KDQojVGhpcyBpcyByZWFsbHkgYWxsIGFzdGhldGljLiBJIGRvbid0IHdhbnQgdGhlICMgb2YgcmVzcG9uc2VzIHRvIGhhdmUgdHdvIGRlY2ltYWwgcGxhY2VzLCBzbyBJIG5lZWQgdG8gdGFrZSBpdCBvdXQsIG1hbmlwdWxhdGUgaXQsIHRoZW4gcHV0IGl0IGJhY2sgaW4uIA0KIyNBbHNvLCBJIGtub3cgaXQncyB3ZWlyZCwgYnV0IEknbSBjb252ZXJ0aW5nIHRoaW5ncyBpbnRvIGNoYXJhY3RlciB2YXJpYWJsZXMgZm9yIHByZXNlbnRhdGlvbi4gVGhpcyBtYWtlcyB0aGluZ3MgYmluZCBlYXNpZXIgYW5kIEkgd2lsbCBiZSBhYmxlIHRvIG1ha2UgdGhpbmdzIGVhc2llciBmb3IgTmFOJ3MNCnJlc3BfbnVtIDwtIG5zICU+JSANCiAgZmlsdGVyKGlzLm5hKGBJdGVtIHRleHRgKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDApICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gaWZlbHNlKGBJdGVtIHRleHRgID09ICJOQSIsICIiLCAiIikpICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBhcy5jaGFyYWN0ZXIoYEl0ZW0gdGV4dGApLA0KICAgICAgICAgYEl0ZW0gdGV4dGA9IGlmZWxzZShpcy5uYShgSXRlbSB0ZXh0YCksICIjIG9mIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiKSkgDQoNCg0KcmVzcF9udW1bXSA8LSBsYXBwbHkocmVzcF9udW0sIGZ1bmN0aW9uKHgpIHBhc3RlKHgsICJyZXNwb25zZShzKSIsIHNlcD0iICIpKQ0KDQpyZXNwX251bSA8LSByZXNwX251bSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGlmZWxzZShgSXRlbSB0ZXh0YCA9PSAiIyBvZiByZXNwb25zZShzKSByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiKSkNCiAgDQoNCiNUdXJuIGV2ZXJ5dGhpbmcgaW50byBjaGFyYWN0ZXIsIGFuZCBwcmVwYXJlIHRvIGJpbmQgYmFjayBpbiB0aGUgcmVzcG9uc2UgIydzDQpucyA8LSBucyAlPiUgDQogIGZpbHRlcighaXMubmEoYEl0ZW0gdGV4dGApKSAlPiUgIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgYXMuY2hhcmFjdGVyKQ0KDQojQmluZCB0aGVtDQpucyA8LSBiaW5kX3Jvd3MocmVzcF9udW0sIG5zKQ0KDQojVHVybiBhbnkgIk5hbiIncyBpbnRvICJObyByZXNwb25zZQ0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bnMoc3RyX3JlcGxhY2UoLiwgIk5hTiIsICJEaWQgbm90IGFuc3dlciIpKSkNCg0KDQoNCg0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGUoRGlzdHJpY3QgPSByb3duYW1lcyhucykpICU+JSANCiAgc2VsZWN0KERpc3RyaWN0LCBldmVyeXRoaW5nKCkpDQoNCnNpMyA8LSBucyAlPiUgDQogIGZpbHRlcihEaXN0cmljdCA9PSAiQXZlcmFnZSIpDQoNCiNNYWtlIGEgbmljZSwgaW50ZXJhY3RpdmUgdGFibGUNCm5zICU+JSANCiBEVDo6ZGF0YXRhYmxlKGVzY2FwZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGF1dG9IaWRlTmF2aWdhdGlvbiA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGZpbGxDb250YWluZXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGNsYXNzID0gInN0cmlwZSByb3ctYm9yZGVyIiwNCiAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBjKCdGaXhlZENvbHVtbnMnLCAnS2V5VGFibGUnKSwNCiAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZENvbHVtbnMgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMzUwcHgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM9ICJfYWxsIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOycsJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWx0b29sczo6ZW0oJzEgPSBNZWV0IGFubnVhbGx5LCAyID0gQmktQW5udWFsbHksIDMgPSBRdWFydGVybHksIDQgPSBtb250aGx5ICcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgKSAlPiUgDQogIGZvcm1hdFN0eWxlKG5hbWVzKG5zKSwgYmFja2dyb3VuZENvbG9yID0gc3R5bGVJbnRlcnZhbChjKDAsMSwyLDMsNCksIGNscnMpKSAjJT4lIA0KICAjICBmb3JtYXRTdHlsZSgnSXRlbSB0ZXh0JywgdGFyZ2V0ID0gJ3JvdycsIA0KICAjICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yID0gc3R5bGVFcXVhbChteV92YWxzLCBteV9jb2xvcnMpKQ0KDQoNCmBgYA0KDQoqTm90ZTogR3JheSBjZWxscyByZXByZXNlbnQgbG93ZXIgYWdyZWVhbmNlIHdpdGggdGhlIGl0ZW1zIChjb2x1bW5zKS4gVGhlIHJlc3BvbnNlcyBhcmUgc2VwYXJhdGVkIGJ5IGRpc3RyaWN0IChyb3dzKSoNCg0KIyNPcGluaW9ucyBvZiBMU0cgd29ya3Nob3AgZWZmZWN0aXZlbmVzcyB7I3NlYzUuNX0NCg0KDQo8YnI+DQo8YmxvY2txdW90ZT48Zm9udCBzaXplPSI2Ij4gKipUbyB3aGF0IGV4dGVudCBkbyB5b3UgYWdyZWUgb3IgZGlzYWdyZWUgd2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgYWJvdXQgb3BlcmF0aW5nIHByb2NlZHVyZXMgb2YgdGhlIHNjaG9vbCBib2FyZCBhbmQgc3VwZXJpbnRlbmRlbnQqKjwvZm9udD4gPC9ibG9ja3F1b3RlPg0KPGJyPjxicj4NCg0KYGBge3Igd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KDQoNCiNTdW1tYXJpemUgdG8gZ2V0IG1lYW4gdmFsdWVzDQptZWFucyA8LSBzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocm9sZSA9PSAiU3VwZXJpbnRlbmRlbnQiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgc3RhcnRzX3dpdGgoInByb2MiKSkgJT4lIA0KICAjcmVuYW1lKHByb2NfcHJpb3IgPSAicHJvY19wcmlvclIiKQ0KICBncm91cF9ieShUaXRsZSkgJT4lIA0KICBzdW1tYXJpc2VfYWxsKG1lYW4sIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBuc21hbGwgPSAyKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJwcm9jIikpICwgYXMubnVtZXJpYykNCg0KDQpvdmVyYWxsX21lYW4gPC0gbWVhbnMgJT4lDQogIHN1bW1hcml6ZV9hdCh2YXJzKDI6bGVuZ3RoKG1lYW5zKSksIG1lYW4sIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoVGl0bGUgPSAiQXZlcmFnZSIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBldmVyeXRoaW5nKCkpDQoNCm1lYW5zIDwtICAgYmluZF9yb3dzKG92ZXJhbGxfbWVhbiwgbWVhbnMpDQoNCiNGaWx0ZXIgdG8ganVzdCB2YXJpYWJsZXMgSSB3YW50DQpucyA8LSBzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocm9sZSA9PSAiU3VwZXJpbnRlbmRlbnQiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgc3RhcnRzX3dpdGgoInByb2MiKSkgJT4lIA0KICBncm91cF9ieShUaXRsZSkgJT4lIA0KICBzdW1tYXJpemUobiA9IG4oKSkNCg0KI3JvdW5kIGFsbCBudW1lcmljIHZhcmlhYmxlIHRvIDIgZGVjaW1hbCBwbGFjZXMNCm5zIDwtIG5zICU+JSANCiAgcmlnaHRfam9pbihtZWFucywgYnkgPSAiVGl0bGUiKSAlPiUgDQogIG11dGF0ZShuID0gaWZlbHNlKGlzLm5hKG4pLCBzdW0obiwgbmEucm0gPSBUUlVFKSwgbikpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKSANCg0KI0dyYWIgbmFtZXMgZnJvbSAoTmFtZXMgZ2V0IGxvc3QgaW4gdHJhbnNwb3NlKQ0KdGhpcyA8LSBuYW1lcyhucykNCg0KI1RyYW5zcG9zZSAoRmlzdCBjb2x1bW4gbmFtZXMgZ2V0IGxvc3QgZm9yIHNvbWUgcmVhc29uIEkgcmVhbGx5IGRvbid0IHVuZGVyc3RhbmQgd2h5IGRhdGEudGFibGUgZG9lcyB0aGlzLikNCm5zIDwtIG5zICU+JSANCiAgdHJhbnNwb3NlKCkgDQoNCiNSZWludHJvZHVjZSB0aGUgcm93bmFtZXMNCnJvd25hbWVzKG5zKSA8LSB0aGlzDQoNCiNUaGUgZmlyc3Qgcm93IHNob3VsZCBiZSB0aGUgY29sdW1uIG5hbWVzLiBIZXJlLCBJIGFtIG1ha2luZyB0aGF0IGhhcHBlbg0KY29sbmFtZXMobnMpIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QobnNbMSxdKSkgI1B1dCBmaXJzdCByb3cgaW50byBjb2x1bW4gbmFtZXMNCm5zID0gbnNbLTEsIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEZWxldGUgZmlyc3Qgcm93DQoNCiNHcmFiIHRoZSBuYW1lcyB0aGF0IHN0YXJ0IHdpdGgsICJhZ3JlZSIgZnJvbSB0aGUgdmFybmFtZXMgbGlzdC4gSSB3YW50IHRvIHByZXNlbnQgdGhlIGl0ZW0gdGV4dCwgcmF0aGVyIHRoYW4gdGhlIHZhcmlhYmxlIG5hbWVzLi4uIHdoaWNoIGlzIHByZXNlbnQNCmFncmVlX25hbWVzIDwtIHZhcm5hbWVzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QodmFybmFtZSwgInByb2MiKSA9PSBUUlVFKSAlPiUgDQogIHNlbGVjdCh2YXJuYW1lLCBPcmlnX3Jlc3ApIA0KDQoNCiNOb3cgbWVyZ2UgdGhlIGFncmVlIG5hbWVzIGludG8gdGhlIGRhdHNldA0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZSh2YXJuYW1lID0gcm93Lm5hbWVzKG5zKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWdyZWVfbmFtZXMsIGJ5ID0gInZhcm5hbWUiKSAlPiUgDQogIHNlbGVjdChgSXRlbSB0ZXh0YCA9ICJPcmlnX3Jlc3AiLCBldmVyeXRoaW5nKCksIC12YXJuYW1lKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikgJT4lICNSb3VuZCBldmVyeXRoaW5nIHRvIDIgZGlnaXRzDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICAjTWFrZSBzdXJlIG9ubHkgdHdvIGRpZ2l0cyBkZXNwbGF5DQoNCg0KDQoNCiNUaGlzIGlzIHJlYWxseSBhbGwgYXN0aGV0aWMuIEkgZG9uJ3Qgd2FudCB0aGUgIyBvZiByZXNwb25zZXMgdG8gaGF2ZSB0d28gZGVjaW1hbCBwbGFjZXMsIHNvIEkgbmVlZCB0byB0YWtlIGl0IG91dCwgbWFuaXB1bGF0ZSBpdCwgdGhlbiBwdXQgaXQgYmFjayBpbi4gDQojI0Fsc28sIEkga25vdyBpdCdzIHdlaXJkLCBidXQgSSdtIGNvbnZlcnRpbmcgdGhpbmdzIGludG8gY2hhcmFjdGVyIHZhcmlhYmxlcyBmb3IgcHJlc2VudGF0aW9uLiBUaGlzIG1ha2VzIHRoaW5ncyBiaW5kIGVhc2llciBhbmQgSSB3aWxsIGJlIGFibGUgdG8gbWFrZSB0aGluZ3MgZWFzaWVyIGZvciBOYU4ncw0KcmVzcF9udW0gPC0gbnMgJT4lIA0KICBmaWx0ZXIoaXMubmEoYEl0ZW0gdGV4dGApKSAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgbnNtYWxsID0gMCkgJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBpZmVsc2UoYEl0ZW0gdGV4dGAgPT0gIk5BIiwgIiIsICIiKSkgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGFzLmNoYXJhY3RlcihgSXRlbSB0ZXh0YCksDQogICAgICAgICBgSXRlbSB0ZXh0YD0gaWZlbHNlKGlzLm5hKGBJdGVtIHRleHRgKSwgIiMgb2YgcmVzcG9uc2UocykiLCAiIyBvZiByZXNwb25zZShzKSIpKSANCg0KDQpyZXNwX251bVtdIDwtIGxhcHBseShyZXNwX251bSwgZnVuY3Rpb24oeCkgcGFzdGUoeCwgInJlc3BvbnNlKHMpIiwgc2VwPSIgIikpDQoNCnJlc3BfbnVtIDwtIHJlc3BfbnVtICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gaWZlbHNlKGBJdGVtIHRleHRgID09ICIjIG9mIHJlc3BvbnNlKHMpIHJlc3BvbnNlKHMpIiwgIiMgb2YgcmVzcG9uc2UocykiLCAiIyBvZiByZXNwb25zZShzKSIpKQ0KICANCg0KI1R1cm4gZXZlcnl0aGluZyBpbnRvIGNoYXJhY3RlciwgYW5kIHByZXBhcmUgdG8gYmluZCBiYWNrIGluIHRoZSByZXNwb25zZSAjJ3MNCm5zIDwtIG5zICU+JSANCiAgZmlsdGVyKCFpcy5uYShgSXRlbSB0ZXh0YCkpICU+JSAgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBhcy5jaGFyYWN0ZXIpDQoNCiNCaW5kIHRoZW0NCm5zIDwtIGJpbmRfcm93cyhyZXNwX251bSwgbnMpDQoNCiNUdXJuIGFueSAiTmFuIidzIGludG8gIk5vIHJlc3BvbnNlDQpucyA8LSBucyAlPiUgDQogIG11dGF0ZV9hbGwoZnVucyhzdHJfcmVwbGFjZSguLCAiTmFOIiwgIkRpZCBub3QgYW5zd2VyIikpKQ0KDQoNCg0KDQoNCg0KI0dyYWIgbmFtZXMgZnJvbSAoTmFtZXMgZ2V0IGxvc3QgaW4gdHJhbnNwb3NlKQ0KdGhpcyA8LSBuYW1lcyhucykNCg0KI1RyYW5zcG9zZSAoRmlzdCBjb2x1bW4gbmFtZXMgZ2V0IGxvc3QgZm9yIHNvbWUgcmVhc29uIEkgcmVhbGx5IGRvbid0IHVuZGVyc3RhbmQgd2h5IGRhdGEudGFibGUgZG9lcyB0aGlzLikNCm5zIDwtIG5zICU+JSANCiAgdHJhbnNwb3NlKCkgDQoNCiNSZWludHJvZHVjZSB0aGUgcm93bmFtZXMNCnJvd25hbWVzKG5zKSA8LSB0aGlzDQoNCiNUaGUgZmlyc3Qgcm93IHNob3VsZCBiZSB0aGUgY29sdW1uIG5hbWVzLiBIZXJlLCBJIGFtIG1ha2luZyB0aGF0IGhhcHBlbg0KY29sbmFtZXMobnMpIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QobnNbMSxdKSkgI1B1dCBmaXJzdCByb3cgaW50byBjb2x1bW4gbmFtZXMNCm5zID0gbnNbLTEsIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEZWxldGUgZmlyc3Qgcm93DQoNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlKERpc3RyaWN0ID0gcm93bmFtZXMobnMpKSAlPiUgDQogIHNlbGVjdChEaXN0cmljdCwgZXZlcnl0aGluZygpKQ0KDQpzaTQgPC0gbnMgJT4lIA0KICBmaWx0ZXIoRGlzdHJpY3QgPT0gIkF2ZXJhZ2UiKQ0KDQoNCiNNYWtlIGEgbmljZSwgaW50ZXJhY3RpdmUgdGFibGUNCm5zICU+JSANCiBEVDo6ZGF0YXRhYmxlKGVzY2FwZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGF1dG9IaWRlTmF2aWdhdGlvbiA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGZpbGxDb250YWluZXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGNsYXNzID0gInN0cmlwZSByb3ctYm9yZGVyIiwNCiAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBjKCdGaXhlZENvbHVtbnMnLCAnS2V5VGFibGUnKSwNCiAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxZID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZENvbHVtbnMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9IjMwMHB4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzPSAiX2FsbCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IHRleHQtYWxpZ246IGNlbnRlcjsnLCcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sdG9vbHM6OmVtKCcxID0gU3Ryb25nbHkgRGlzYWdyZWUsIDQgPSBTdHJvbmdseSBBZ3JlZTsgTm90ZTogSXRlbSAiZyIgaGFzIGJlZW4gcmV2ZXJzZSBjb2RlZCAoNCA9IFN0cm9uZ2x5IGRpYWdyZWUsIDEgPSBTdHJvbmdseSBBZ3JlZSknKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICkgJT4lIA0KICBmb3JtYXRTdHlsZShuYW1lcyhucyksIGJhY2tncm91bmRDb2xvciA9IHN0eWxlSW50ZXJ2YWwoYygwLDEsMiwzLDQpLCBjbHJzKSkgIyU+JSANCiAgIyAgZm9ybWF0U3R5bGUoJ0l0ZW0gdGV4dCcsIHRhcmdldCA9ICdyb3cnLCANCiAgIyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvciA9IHN0eWxlRXF1YWwobXlfdmFscywgbXlfY29sb3JzKSkNCg0KYGBgDQoNCg0KDQojI09waW5pb24gb2YgTFNHIHdvcmtzaG9wIHsjc2VjNS42fQ0KDQo8YnI+DQo8YmxvY2txdW90ZT48Zm9udCBzaXplPSI2Ij4gKipUbyB3aGF0IGV4dGVudCBkbyB5b3UgYWdyZWUgb3IgZGlzYWdyZWUgd2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgcmVnYXJkaW5nIExTRyoqPC9mb250PiA8L2Jsb2NrcXVvdGU+DQo8YnI+PGJyPg0KDQpgYGB7ciB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQoNCg0KI1N1bW1hcml6ZSB0byBnZXQgbWVhbiB2YWx1ZXMNCm1lYW5zIDwtIHN1cnZleSAlPiUgDQogIGZpbHRlcihyb2xlID09ICJTdXBlcmludGVuZGVudCIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBzdGFydHNfd2l0aCgiYWdyZWUiKSwgLWFncmVlX2hvbmRpc2MsIC1hZ3JlZV9yZXNwLCAtYWdyZWVfcGFydGljKSAlPiUgDQogIGdyb3VwX2J5KFRpdGxlKSAlPiUgDQogIHN1bW1hcmlzZV9hbGwobWVhbiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImFncmVlIikpICwgYXMubnVtZXJpYykNCg0KDQpvdmVyYWxsX21lYW4gPC0gbWVhbnMgJT4lDQogIHN1bW1hcml6ZV9hdCh2YXJzKDI6bGVuZ3RoKG1lYW5zKSksIG1lYW4sIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoVGl0bGUgPSAiQXZlcmFnZSIpICU+JSANCiAgc2VsZWN0KFRpdGxlLCBldmVyeXRoaW5nKCkpDQoNCm1lYW5zIDwtICAgYmluZF9yb3dzKG92ZXJhbGxfbWVhbiwgbWVhbnMpDQoNCiNGaWx0ZXIgdG8ganVzdCB2YXJpYWJsZXMgSSB3YW50DQpucyA8LSBzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocm9sZSA9PSAiU3VwZXJpbnRlbmRlbnQiKSAlPiUgDQogIHNlbGVjdChUaXRsZSwgc3RhcnRzX3dpdGgoImFncmVlIiksIC1hZ3JlZV9ob25kaXNjLCAtYWdyZWVfcmVzcCwgLWFncmVlX3BhcnRpYykgJT4lIA0KICBncm91cF9ieShUaXRsZSkgJT4lIA0KICBzdW1tYXJpemUobiA9IG4oKSkNCg0KI3JvdW5kIGFsbCBudW1lcmljIHZhcmlhYmxlIHRvIDIgZGVjaW1hbCBwbGFjZXMNCm5zIDwtIG5zICU+JSANCiAgcmlnaHRfam9pbihtZWFucywgYnkgPSAiVGl0bGUiKSAlPiUgDQogIG11dGF0ZShuID0gaWZlbHNlKGlzLm5hKG4pLCBzdW0obiwgbmEucm0gPSBUUlVFKSwgbikpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKSANCg0KI0dyYWIgbmFtZXMgZnJvbSAoTmFtZXMgZ2V0IGxvc3QgaW4gdHJhbnNwb3NlKQ0KdGhpcyA8LSBuYW1lcyhucykNCg0KI1RyYW5zcG9zZSAoRmlzdCBjb2x1bW4gbmFtZXMgZ2V0IGxvc3QgZm9yIHNvbWUgcmVhc29uIEkgcmVhbGx5IGRvbid0IHVuZGVyc3RhbmQgd2h5IGRhdGEudGFibGUgZG9lcyB0aGlzLikNCm5zIDwtIG5zICU+JSANCiAgdHJhbnNwb3NlKCkgDQoNCiNSZWludHJvZHVjZSB0aGUgcm93bmFtZXMNCnJvd25hbWVzKG5zKSA8LSB0aGlzDQoNCiNUaGUgZmlyc3Qgcm93IHNob3VsZCBiZSB0aGUgY29sdW1uIG5hbWVzLiBIZXJlLCBJIGFtIG1ha2luZyB0aGF0IGhhcHBlbg0KY29sbmFtZXMobnMpIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QobnNbMSxdKSkgI1B1dCBmaXJzdCByb3cgaW50byBjb2x1bW4gbmFtZXMNCm5zID0gbnNbLTEsIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNEZWxldGUgZmlyc3Qgcm93DQoNCiNHcmFiIHRoZSBuYW1lcyB0aGF0IHN0YXJ0IHdpdGgsICJhZ3JlZSIgZnJvbSB0aGUgdmFybmFtZXMgbGlzdC4gSSB3YW50IHRvIHByZXNlbnQgdGhlIGl0ZW0gdGV4dCwgcmF0aGVyIHRoYW4gdGhlIHZhcmlhYmxlIG5hbWVzLi4uIHdoaWNoIGlzIHByZXNlbnQNCmFncmVlX25hbWVzIDwtIHZhcm5hbWVzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QodmFybmFtZSwgImFncmVlIikgPT0gVFJVRSAmIHZhcm5hbWUgIT0gImFncmVlX2hvbmRpc2MiICYgdmFybmFtZSAhPSAiYWdyZWVfcmVzcCIgJiB2YXJuYW1lICE9ICJhZ3JlZV9wYXJ0aWMiKSAlPiUgDQogIHNlbGVjdCh2YXJuYW1lLCBPcmlnX3Jlc3ApIA0KDQoNCiNOb3cgbWVyZ2UgdGhlIGFncmVlIG5hbWVzIGludG8gdGhlIGRhdHNldA0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZSh2YXJuYW1lID0gcm93Lm5hbWVzKG5zKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWdyZWVfbmFtZXMsIGJ5ID0gInZhcm5hbWUiKSAlPiUgDQogIHNlbGVjdChgSXRlbSB0ZXh0YCA9ICJPcmlnX3Jlc3AiLCBldmVyeXRoaW5nKCksIC12YXJuYW1lKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikgJT4lICNSb3VuZCBldmVyeXRoaW5nIHRvIDIgZGlnaXRzDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIG5zbWFsbCA9IDIpICAjTWFrZSBzdXJlIG9ubHkgdHdvIGRpZ2l0cyBkZXNwbGF5DQoNCg0KDQoNCiNUaGlzIGlzIHJlYWxseSBhbGwgYXN0aGV0aWMuIEkgZG9uJ3Qgd2FudCB0aGUgIyBvZiByZXNwb25zZShzKSB0byBoYXZlIHR3byBkZWNpbWFsIHBsYWNlcywgc28gSSBuZWVkIHRvIHRha2UgaXQgb3V0LCBtYW5pcHVsYXRlIGl0LCB0aGVuIHB1dCBpdCBiYWNrIGluLiANCiMjQWxzbywgSSBrbm93IGl0J3Mgd2VpcmQsIGJ1dCBJJ20gY29udmVydGluZyB0aGluZ3MgaW50byBjaGFyYWN0ZXIgdmFyaWFibGVzIGZvciBwcmVzZW50YXRpb24uIFRoaXMgbWFrZXMgdGhpbmdzIGJpbmQgZWFzaWVyIGFuZCBJIHdpbGwgYmUgYWJsZSB0byBtYWtlIHRoaW5ncyBlYXNpZXIgZm9yIE5hTidzDQpyZXNwX251bSA8LSBucyAlPiUgDQogIGZpbHRlcihpcy5uYShgSXRlbSB0ZXh0YCkpICU+JSANCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBuc21hbGwgPSAwKSAlPiUgDQogIG11dGF0ZShgSXRlbSB0ZXh0YCA9IGlmZWxzZShgSXRlbSB0ZXh0YCA9PSAiTkEiLCAiIiwgIiIpKSAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSANCiAgbXV0YXRlKGBJdGVtIHRleHRgID0gYXMuY2hhcmFjdGVyKGBJdGVtIHRleHRgKSwNCiAgICAgICAgIGBJdGVtIHRleHRgPSBpZmVsc2UoaXMubmEoYEl0ZW0gdGV4dGApLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpIA0KDQoNCnJlc3BfbnVtW10gPC0gbGFwcGx5KHJlc3BfbnVtLCBmdW5jdGlvbih4KSBwYXN0ZSh4LCAicmVzcG9uc2UocykiLCBzZXA9IiAiKSkNCg0KcmVzcF9udW0gPC0gcmVzcF9udW0gJT4lIA0KICBtdXRhdGUoYEl0ZW0gdGV4dGAgPSBpZmVsc2UoYEl0ZW0gdGV4dGAgPT0gIiMgb2YgcmVzcG9uc2UocykgcmVzcG9uc2UocykiLCAiIyBvZiByZXNwb25zZShzKSIsICIjIG9mIHJlc3BvbnNlKHMpIikpDQogIA0KDQojVHVybiBldmVyeXRoaW5nIGludG8gY2hhcmFjdGVyLCBhbmQgcHJlcGFyZSB0byBiaW5kIGJhY2sgaW4gdGhlIHJlc3BvbnNlICMncw0KbnMgPC0gbnMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGBJdGVtIHRleHRgKSkgJT4lICANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGFzLmNoYXJhY3RlcikNCg0KI0JpbmQgdGhlbQ0KbnMgPC0gYmluZF9yb3dzKHJlc3BfbnVtLCBucykNCg0KI1R1cm4gYW55ICJOYW4iJ3MgaW50byAiTm8gcmVzcG9uc2UNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlX2FsbChmdW5zKHN0cl9yZXBsYWNlKC4sICJOYU4iLCAiRGlkIG5vdCBhbnN3ZXIiKSkpDQoNCg0KDQojR3JhYiBuYW1lcyBmcm9tIChOYW1lcyBnZXQgbG9zdCBpbiB0cmFuc3Bvc2UpDQp0aGlzIDwtIG5hbWVzKG5zKQ0KDQojVHJhbnNwb3NlIChGaXN0IGNvbHVtbiBuYW1lcyBnZXQgbG9zdCBmb3Igc29tZSByZWFzb24gSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgZGF0YS50YWJsZSBkb2VzIHRoaXMuKQ0KbnMgPC0gbnMgJT4lIA0KICB0cmFuc3Bvc2UoKSANCg0KI1JlaW50cm9kdWNlIHRoZSByb3duYW1lcw0Kcm93bmFtZXMobnMpIDwtIHRoaXMNCg0KI1RoZSBmaXJzdCByb3cgc2hvdWxkIGJlIHRoZSBjb2x1bW4gbmFtZXMuIEhlcmUsIEkgYW0gbWFraW5nIHRoYXQgaGFwcGVuDQpjb2xuYW1lcyhucykgPC0gYXMuY2hhcmFjdGVyKHVubGlzdChuc1sxLF0pKSAjUHV0IGZpcnN0IHJvdyBpbnRvIGNvbHVtbiBuYW1lcw0KbnMgPSBuc1stMSwgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0RlbGV0ZSBmaXJzdCByb3cNCg0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGUoRGlzdHJpY3QgPSByb3duYW1lcyhucykpICU+JSANCiAgc2VsZWN0KERpc3RyaWN0LCBldmVyeXRoaW5nKCkpDQoNCnNpNSA8LSBucyAlPiUgDQogIGZpbHRlcihEaXN0cmljdCA9PSAiQXZlcmFnZSIpDQoNCg0KI01ha2UgYSBuaWNlLCBpbnRlcmFjdGl2ZSB0YWJsZQ0KbnMgJT4lIA0KIERUOjpkYXRhdGFibGUoZXNjYXBlID0gVFJVRSwgDQogICAgICAgICAgICAgICBhdXRvSGlkZU5hdmlnYXRpb24gPSBGQUxTRSwgDQogICAgICAgICAgICAgICBmaWxsQ29udGFpbmVyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICBjbGFzcyA9ICJzdHJpcGUgcm93LWJvcmRlciIsDQogICAgICAgICAgICAgICBleHRlbnNpb25zID0gYygnRml4ZWRDb2x1bW5zJywgJ0tleVRhYmxlJyksDQogICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsWSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFggPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRDb2x1bW5zID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPSIzMDBweCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cz0gIl9hbGwiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyB0ZXh0LWFsaWduOiBjZW50ZXI7JywnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbHRvb2xzOjplbSgnMSA9IFN0cm9uZ2x5IERpc2FncmVlLCAyID0gRGlzYWdyZWUsIDMgPSBBZ3JlZSwgNCA9IFN0cm9uZ2x5IEFncmVlJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICApICU+JSANCiAgZm9ybWF0U3R5bGUobmFtZXMobnMpLCBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUludGVydmFsKGMoMCwxLDIsMyw0KSwgY2xycykpICMlPiUgDQogICMgIGZvcm1hdFN0eWxlKCdJdGVtIHRleHQnLCB0YXJnZXQgPSAncm93JywgDQogICMgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUVxdWFsKG15X3ZhbHMsIG15X2NvbG9ycykpDQoNCg0KYGBgDQoNCg0KDQoNCiNDb21wYXJpc29ucyBieSBSb2xlcyB7I3NlY25ld30NCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQojU0kgY29sb3JzDQpjbHJzIDwtIHJvdW5kKHNlcSgxMDAsIDIwMCwgbGVuZ3RoLm91dCA9IGxlbmd0aChjKDAsMSwyLDMsNCkgKSsgMSksIDApICU+JQ0Ke3Bhc3RlMCgicmdiKDEwMCwiLCAuLCAiNTUsIiwgLiwgIikiKX0NCmBgYA0KDQoNCiMjRXh0ZW50IHRvIHdoaWNoIHN0YWtlaG9sZGVycyBwcm92aWRlIGlucHV0IHsjc2VjbmV3LjJ9DQo8YnI+DQo8YmxvY2txdW90ZT4gPGZvbnQgc2l6ZT0iNiI+ICoqKkluIDIwMTgtMTksIHRvIHdoYXQgZXh0ZW50IGhhdmUgdGhlIGZvbGxvd2luZyBncm91cHMgb2Ygc3Rha2Vob2xkZXJzIHByb3ZpZGVkIGlucHV0IHRvIHRoZSBzY2hvb2wgYm9hcmQgcmVnYXJkaW5nIGRldmVsb3BtZW50IG9mIGdvYWxzIG9yIHZpc2lvbj8qKio8L2ZvbnQ+IDwvYmxvY2txdW90ZT4NCjxicj48YnI+DQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCg0KDQpucyA8LSBiaW5kX3Jvd3Moc21iMSwgc2kxLCAuaWQgPSAiUm9sZSIpDQpucyA8LSBucyAlPiUgDQogIG11dGF0ZShSb2xlID0gaWZlbHNlKFJvbGUgPT0gIjEiLCAiU2Nob29sIEJvYXJkIE1lbWJlciIsICJTdXBlcmludGVuZGVudCIpKSAlPiUgDQogIHNlbGVjdChSb2xlLCBldmVyeXRoaW5nKCksIC1EaXN0cmljdCkNCg0KDQpucyAlPiUgDQogRFQ6OmRhdGF0YWJsZShlc2NhcGUgPSBUUlVFLCANCiAgICAgICAgICAgICAgIGF1dG9IaWRlTmF2aWdhdGlvbiA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGZpbGxDb250YWluZXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIGNsYXNzID0gInN0cmlwZSByb3ctYm9yZGVyIiwNCiAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBjKCdGaXhlZENvbHVtbnMnLCAnS2V5VGFibGUnKSwNCiAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KCNwYWdlTGVuZ3RoID0gMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsWSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFggPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRDb2x1bW5zID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPSIzMDBweCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cz0gIl9hbGwiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyB0ZXh0LWFsaWduOiBjZW50ZXI7JywnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbHRvb2xzOjplbSgnMSA9IE5vIGlucHV0LCAyID0gTGltaXRlZCBpbnB1dCwgMyA9IE1vZGVyYXRlIGlucHV0LCA0ID0gU3Vic3RhbnRpYWwgaW5wdXQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICkgJT4lIA0KICBmb3JtYXRTdHlsZShuYW1lcyhucyksIGJhY2tncm91bmRDb2xvciA9IHN0eWxlSW50ZXJ2YWwoYygwLDEsMiwzLDQpLCBjbHJzKSkgIyU+JSANCg0KYGBgDQoNCiMjT3BpbmlvbnMgb2Ygc2Nob29sIGJvYXJkIG1lZXRpbmdzIHsjc2VjbmV3LjN9DQo8YnI+DQo8YmxvY2txdW90ZT4gPGZvbnQgc2l6ZT0iNiI+ICoqVG8gd2hhdCBleHRlbnQgZG8geW91IGFncmVlIHdpdGggb3IgZGlzYWdyZWUgd2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgcmVnYXJkaW5nIHNjaG9vbCBib2FyZCBkaXNjdXNzaW9ucz8qKjwvZm9udD4gPC9ibG9ja3F1b3RlPg0KPGJyPjxicj4NCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbnMgPC0gYmluZF9yb3dzKHNtYjIsIHNpMiwgLmlkID0gIlJvbGUiKQ0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGUoUm9sZSA9IGlmZWxzZShSb2xlID09ICIxIiwgIlNjaG9vbCBCb2FyZCBNZW1iZXIiLCAiU3VwZXJpbnRlbmRlbnQiKSkgJT4lIA0KICBzZWxlY3QoUm9sZSwgZXZlcnl0aGluZygpLCAtRGlzdHJpY3QpDQoNCg0KbnMgJT4lIA0KIERUOjpkYXRhdGFibGUoZXNjYXBlID0gVFJVRSwgDQogICAgICAgICAgICAgICBhdXRvSGlkZU5hdmlnYXRpb24gPSBGQUxTRSwgDQogICAgICAgICAgICAgICBmaWxsQ29udGFpbmVyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICBjbGFzcyA9ICJzdHJpcGUgcm93LWJvcmRlciIsDQogICAgICAgICAgICAgICBleHRlbnNpb25zID0gYygnRml4ZWRDb2x1bW5zJywgJ0tleVRhYmxlJyksDQogICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdCgjcGFnZUxlbmd0aCA9IDEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkQ29sdW1ucyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMzAwcHgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM9ICJfYWxsIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOycsJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWx0b29sczo6ZW0oJzEgPSBTdHJvbmdseSBEaXNhZ3JlZSwgMiA9IERpc2FncmVlLCAzID0gQWdyZWUsIDQgPSBTdHJvbmdseSBBZ3JlZScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgKSAlPiUgDQogIGZvcm1hdFN0eWxlKG5hbWVzKG5zKSwgYmFja2dyb3VuZENvbG9yID0gc3R5bGVJbnRlcnZhbChjKDAsMSwyLDMsNCksIGNscnMpKSAjJT4lIA0KYGBgDQojI0VuZ2FnZW1lbnQgaW4gYWN0aXZpdGllcyB7I3NlY25ldy40fQ0KDQo8YnI+DQo8YmxvY2txdW90ZT4gPGZvbnQgc2l6ZT0iNiI+ICoqSG93IG9mdGVuIGRvZXMgeW91ciBzY2hvb2wgYm9hcmQgZW5nYWdlIGluIHRoZSBmb2xsb3dpbmcgbW9uaXRvcmluZyBhY3Rpdml0aWVzPyoqPC9mb250PiA8L2Jsb2NrcXVvdGU+DQo8YnI+PGJyPg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpucyA8LSBiaW5kX3Jvd3Moc21iMywgc2kzLCAuaWQgPSAiUm9sZSIpDQpucyA8LSBucyAlPiUgDQogIG11dGF0ZShSb2xlID0gaWZlbHNlKFJvbGUgPT0gIjEiLCAiU2Nob29sIEJvYXJkIE1lbWJlciIsICJTdXBlcmludGVuZGVudCIpKSAlPiUgDQogIHNlbGVjdChSb2xlLCBldmVyeXRoaW5nKCksIC1EaXN0cmljdCkNCg0KbnMgJT4lIA0KIERUOjpkYXRhdGFibGUoZXNjYXBlID0gVFJVRSwgDQogICAgICAgICAgICAgICBhdXRvSGlkZU5hdmlnYXRpb24gPSBGQUxTRSwgDQogICAgICAgICAgICAgICBmaWxsQ29udGFpbmVyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICBjbGFzcyA9ICJzdHJpcGUgcm93LWJvcmRlciIsDQogICAgICAgICAgICAgICBleHRlbnNpb25zID0gYygnRml4ZWRDb2x1bW5zJywgJ0tleVRhYmxlJyksDQogICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdCgjcGFnZUxlbmd0aCA9IDEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkQ29sdW1ucyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMzAwcHgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM9ICJfYWxsIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOycsJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWx0b29sczo6ZW0oJzEgPSBBbm51YWxseSwgMiA9IEJpLUFubnVhbGx5LCAzID0gUXVhcnRlcmx5LCA0ID0gTW9udGhseScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgKSAlPiUgDQogIGZvcm1hdFN0eWxlKG5hbWVzKG5zKSwgYmFja2dyb3VuZENvbG9yID0gc3R5bGVJbnRlcnZhbChjKDAsMSwyLDMsNCksIGNscnMpKSAjJT4lIA0KYGBgDQoNCiMjT3BpbmlvbnMgb2YgTFNHIHdvcmtzaG9wIGVmZmVjdGl2ZW5lc3MgeyNzZWNuZXcuNX0NCg0KPGJyPg0KPGJsb2NrcXVvdGU+PGZvbnQgc2l6ZT0iNiI+ICoqVG8gd2hhdCBleHRlbnQgZG8geW91IGFncmVlIG9yIGRpc2FncmVlIHdpdGggdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGFib3V0IG9wZXJhdGluZyBwcm9jZWR1cmVzIG9mIHRoZSBzY2hvb2wgYm9hcmQgYW5kIHN1cGVyaW50ZW5kZW50Kio8L2ZvbnQ+IDwvYmxvY2txdW90ZT4NCjxicj48YnI+DQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCm5zIDwtIGJpbmRfcm93cyhzbWI0LCBzaTQsIC5pZCA9ICJSb2xlIikNCm5zIDwtIG5zICU+JSANCiAgbXV0YXRlKFJvbGUgPSBpZmVsc2UoUm9sZSA9PSAiMSIsICJTY2hvb2wgQm9hcmQgTWVtYmVyIiwgIlN1cGVyaW50ZW5kZW50IikpICU+JSANCiAgc2VsZWN0KFJvbGUsIGV2ZXJ5dGhpbmcoKSwgLURpc3RyaWN0KQ0KDQoNCm5zICU+JSANCiBEVDo6ZGF0YXRhYmxlKGVzY2FwZSA9IFRSVUUsIA0KICAgICAgICAgICAgICAgYXV0b0hpZGVOYXZpZ2F0aW9uID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgZmlsbENvbnRhaW5lciA9IEZBTFNFLCANCiAgICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgY2xhc3MgPSAic3RyaXBlIHJvdy1ib3JkZXIiLA0KICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IGMoJ0ZpeGVkQ29sdW1ucycsICdLZXlUYWJsZScpLA0KICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoI3BhZ2VMZW5ndGggPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvV2lkdGggPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxZID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZENvbHVtbnMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9IjMwMHB4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzPSAiX2FsbCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IHRleHQtYWxpZ246IGNlbnRlcjsnLCcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sdG9vbHM6OmVtKCcxID0gU3Ryb25nbHkgRGlzYWdyZWUsIDQgPSBTdHJvbmdseSBBZ3JlZTsgTm90ZTogSXRlbSAiZyIgaGFzIGJlZW4gcmV2ZXJzZSBjb2RlZCAoNCA9IFN0cm9uZ2x5IGRpYWdyZWUsIDEgPSBTdHJvbmdseSBBZ3JlZSknKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICkgJT4lIA0KICBmb3JtYXRTdHlsZShuYW1lcyhucyksIGJhY2tncm91bmRDb2xvciA9IHN0eWxlSW50ZXJ2YWwoYygwLDEsMiwzLDQpLCBjbHJzKSkgIyU+JSANCmBgYA0KDQojI09waW5pb24gb2YgTFNHIHdvcmtzaG9wIHsjc2VjbmV3LjZ9DQoNCjxicj4NCjxibG9ja3F1b3RlPjxmb250IHNpemU9IjYiPiAqKlRvIHdoYXQgZXh0ZW50IGRvIHlvdSBhZ3JlZSBvciBkaXNhZ3JlZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyByZWdhcmRpbmcgTFNHKio8L2ZvbnQ+IDwvYmxvY2txdW90ZT4NCjxicj48YnI+DQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbnMgPC0gYmluZF9yb3dzKHNtYjUsIHNpNSwgLmlkID0gIlJvbGUiKQ0KbnMgPC0gbnMgJT4lIA0KICBtdXRhdGUoUm9sZSA9IGlmZWxzZShSb2xlID09ICIxIiwgIlNjaG9vbCBCb2FyZCBNZW1iZXIiLCAiU3VwZXJpbnRlbmRlbnQiKSkgJT4lIA0KICBzZWxlY3QoUm9sZSwgZXZlcnl0aGluZygpLCAtRGlzdHJpY3QpDQoNCg0KbnMgJT4lIA0KIERUOjpkYXRhdGFibGUoZXNjYXBlID0gVFJVRSwgDQogICAgICAgICAgICAgICBhdXRvSGlkZU5hdmlnYXRpb24gPSBGQUxTRSwgDQogICAgICAgICAgICAgICBmaWxsQ29udGFpbmVyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwgDQogICAgICAgICAgICAgICBjbGFzcyA9ICJzdHJpcGUgcm93LWJvcmRlciIsDQogICAgICAgICAgICAgICBleHRlbnNpb25zID0gYygnRml4ZWRDb2x1bW5zJywgJ0tleVRhYmxlJyksDQogICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdCgjcGFnZUxlbmd0aCA9IDEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9XaWR0aCA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkQ29sdW1ucyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMzAwcHgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM9ICJfYWxsIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgdGV4dC1hbGlnbjogY2VudGVyOycsJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWx0b29sczo6ZW0oJzEgPSBTdHJvbmdseSBEaXNhZ3JlZSwgMiA9IERpc2FncmVlLCAzID0gQWdyZWUsIDQgPSBTdHJvbmdseSBBZ3JlZScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgKSAlPiUgDQogIGZvcm1hdFN0eWxlKG5hbWVzKG5zKSwgYmFja2dyb3VuZENvbG9yID0gc3R5bGVJbnRlcnZhbChjKDAsMSwyLDMsNCksIGNscnMpKSAjJT4lIA0KYGBgDQoNCg0KI0dvYWwgRGV2ZWxvcG1lbnQgeyNzZWM2fQ0KIyNTY2hvb2wgYm9hcmQgaGFzIGEgVmlzaW9uIGRldmVsb3BlZCB7I3NlYzYuMX0NCg0KPGZvbnQgc2l6ZT0iNiI+IEhhcyB5b3VyIHNjaG9vbCBib2FyZCBkZXZlbG9wZWQgYW5kIGFkb3B0ZWQgYSB2aXNpb24gZm9yIHRoZSBMRUE/IDwvZm9udD4NCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpzdXJ2ZXkgJT4lIA0KICBzZWxlY3QoYERvZXMgeW91ciBib2FyZCBoYXZlIGEgdmlzaW9uP2AgPSAidmlzaW9uIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGBEb2VzIHlvdXIgYm9hcmQgaGF2ZSBhIHZpc2lvbj9gKSkgJT4lIA0KICBncm91cF9ieShgRG9lcyB5b3VyIGJvYXJkIGhhdmUgYSB2aXNpb24/YCkgJT4lIA0KICBzdW1tYXJpemUoTiA9IG4oKSkgJT4lIA0KICBtdXRhdGUoYCVgID0gTiAvIChOWzFdICsgTlsyXSksDQogICAgICAgICBgJWAgPSByb3VuZChgJWAsIDIpLA0KICAgICAgICAgYCVgID0gYCVgKjEwMCwNCiAgICAgICAgIGAlYCA9IHBhc3RlMChgJWAsICIlIikpICU+JSANCiAgRFQ6OmRhdGF0YWJsZShlc2NhcGUgPSBGQUxTRSwgb3B0aW9ucyA9IGxpc3QoY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtbGVmdCcsIHRhcmdldHMgPSAiX2FsbCIpKSkpDQpgYGANCg0KIyNTY2hvb2wgYm9hcmQgaGFzIGdvYWxzIHsjc2VjNi4yfQ0KDQo8YmxvY2txdW90ZT48Zm9udCBzaXplPSI2Ij4gSGFzIHlvdXIgc2Nob29sIGJvYXJkIGFkb3B0ZWQgZ29hbHMgcmVsYXRlZCB0byBzdHVkZW50IG91dGNvbWVzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyB1c2VkPyA8L2ZvbnQ+PC9ibG9ja3F1b3RlPg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpzdXJ2ZXkgJT4lIA0KICBzZWxlY3QoYERvZXMgeW91ciBib2FyZCBoYXZlIGdvYWxzP2AgPSAiZ29hbHMiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYERvZXMgeW91ciBib2FyZCBoYXZlIGdvYWxzP2AgKSkgJT4lIA0KICBncm91cF9ieShgRG9lcyB5b3VyIGJvYXJkIGhhdmUgZ29hbHM/YCApICU+JSANCiAgc3VtbWFyaXplKE4gPSBuKCkpICU+JSANCiAgbXV0YXRlKGAlYCA9IE4gLyAoTlsxXSArIE5bMl0pLA0KICAgICAgICAgYCVgID0gcm91bmQoYCVgLCAyKSwNCiAgICAgICAgIGAlYCA9IGAlYCoxMDAsDQogICAgICAgICBgJWAgPSBwYXN0ZTAoYCVgLCAiJSIpKSAlPiUgDQogIERUOjpkYXRhdGFibGUoZXNjYXBlID0gRkFMU0UsIG9wdGlvbnMgPSBsaXN0KGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWxlZnQnLCB0YXJnZXRzID0gIl9hbGwiKSkpKQ0KYGBgDQoNCiMjI0V4YW1wbGVzIG9mIGdvYWxzIHsjc2VjNi4yLjF9DQpBcmUgdGhlc2UgR29hbHMgUy5NLkEuUi5ULj8NCg0KKipTKipwZWNpZmljPGJyPg0KKipNKiplYXN1cmFibGU8YnI+DQoqKkEqKmNoaWV2YWJsZTxicj4gDQoqKlIqKmVsZXZhbnQ8YnI+DQoqKlQqKmltZS1iYXNlZDxicj4NCg0KPGJsb2NrcXVvdGU+PGZvbnQgc2l6ZT0iNiI+IEluIHRoZSB0ZXh0IGJveGVzIGJlbG93LCBwbGVhc2UgcHJvdmlkZSBleGFtcGxlcyBvZiB0d28gb2YgdGhlIGdvYWxzIHJlbGF0ZWQgdG8gc3R1ZGVudCBvdXRjb21lcyB0aGF0IHRoZSBzY2hvb2wgYm9hcmQgaGFzIGluIHBsYWNlIGZvciB0aGUgMjAxOC0xOSBzY2hvb2wgeWVhci48L2ZvbnQ+PC9ibG9ja3F1b3RlPg0KDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQpnb2FsXzEgPC0gc3VydmV5ICU+JSANCiAgc2VsZWN0KERpc3RyaWN0ID0gIlRpdGxlIiwgR29hbCA9ICJnb2FsX2V4XzEiKSAlPiUgDQogIGZpbHRlcighaXMubmEoR29hbCkpICU+JSANCiAgbXV0YXRlX2lmKGlzLmZhY3RvciwgYXMuY2hhcmFjdGVyKQ0KDQpnb2FsXzIgPC0gc3VydmV5ICU+JSANCiAgc2VsZWN0KERpc3RyaWN0ID0gIlRpdGxlIiwgR29hbCA9ICJnb2FsX2V4XzIiKSAlPiUgDQogIGZpbHRlcighaXMubmEoR29hbCkpJT4lIA0KICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBhcy5jaGFyYWN0ZXIpDQoNCkdvYWxzIDwtIGJpbmRfcm93cyhnb2FsXzEsIGdvYWxfMikgDQoNCkdvYWxzICU+JSANCiAgRFQ6OmRhdGF0YWJsZShlc2NhcGUgPSBGQUxTRSwgb3B0aW9ucyA9IGxpc3QoY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtbGVmdCcsIHRhcmdldHMgPSAiX2FsbCIpKSkpDQoNCg0KDQpgYGANCg0KDQoqKlN0cm9uZyBTLk0uQS5SLlQuIEdvYWxzKioNCg0KMS4gICJUaGUgcGVyY2VudGFnZSBvZiBraW5kZXJnYXJ0ZW4tZ3JhZGUyIHN0dWRlbnRzIHJlYWRpbmcgb24gb3IgYWJvdmUgZ3JhZGUgbGV2ZWwgd2lsbCBpbmNyZWFzZSBmcm9tIDY0JSB0byA5MCUgYnkgeWVhciAyMDIzIg0KMi4gICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIHJlYWRpbmcgb24gb3IgYWJvdmUgZ3JhZGUgbGV2ZWwgd2lsbCBpbmNyZWFzZSBmcm9tIDQzJSB0byA3MCUgYnkgQXVndXN0IDMxLCAyMDIxLiINCjMuICAiQnkgc2Nob29sIHllYXIgMjAyMC0yMDIxIDg1JSBvZiBhbGwgMm5kIGdyYWRlIHN0dWRlbnRzIHdpbGwgYmUgcmVhZGluZyBvbiBncmFkZSBsZXZlbCINCg0KDQoqKldlYWsgUy5NLkEuUi5ULiBHb2FscyoqDQoNCjEuICAiaW5jcmVhc2UgcmVhZGluZyBtYXN0ZXJ5Ig0KMi4gICJIaWdoZXIgZ3JhZHVhdGlvbiByYXRlIg0KMy4gICJUbyBzZWUgaW1wcm92ZW1lbnQgSW4gcmVhZGluZyINCg0KDQojUXVlc3Rpb25zPw0KUGxlYXNlIHNlbmQgYW55IHF1ZXN0aW9ucyB0byBOZWlsIFlldHosIE1QSCBhdCA8bnlldHpAYWlyLm9yZz4NCg0KDQoNCg==